java编程题:题库选题——数学和算法好的来烧下脑

Goskalrie 2016-09-27 10:15:12
题库中有10w道题,每次从其中选取100道不同的题(ID)生成一份试卷,要求是每份试卷之间至少有一道题不重复。
问:
1. 理论上有多少份试卷?(详细计算);
2. 最优实现,写出代码,注意性能和效率。
注,不考虑题目类别、考察知识点什么的,将题目翻译成数字语言:从1~100000中随机生成100个数作为一个组合,每个组合之间至少有一个数是不相等的。理论上能生成多少个组合?生成这些组合的代码是什么?


我最初的想法是:
利用set不重复的特点保存100个Id,使用while循环获得随机数,前100次set.add()不进行set.size()的校验,以后每次校验,直到存够100个。但是判断每个set之间至少有一个不同,这个没想出来,写sql也好,java代码也好,请各路大神支招。能给出最优实现的小菜单独发帖给分!
...全文
224 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Goskalrie 2016-09-27
  • 打赏
  • 举报
回复
引用 1 楼 ITjavaman 的回复:
100000*99999*99998*...*99991/1*2*3*...*100=你自己算- - 。[/color]
提示:是99901而不是99991。 在这个板块问的就是代码,你就不写了……仍然感谢你的回答,结贴时会给分。
ITjavaman 2016-09-27
  • 打赏
  • 举报
回复
如果我没有理解错的话,其实本质是来说这就是一道简单的组合题,不要被“要求是每份试卷之间至少有一道题不重复”误导了,
简单来说可以理解成,从10万个不同的数字里面取出100个数字,求有多少种情况,如果只是想知道多少种情况,这个相对简单点,
高中数学有公式直接算,,不懂百度有。

如果没理解错应该有:100000*99999*99998*...*99991/1*2*3*...*100=你自己算- -

按照公式编码我就不写了。

如果理解错了,以上你们当没看到。
LoveLifeLoveLearn 2016-09-27
  • 打赏
  • 举报
回复
小号也就只能这么用了,说下自己半天的挣扎: 方案一:题库一般的改动频率不是很大,所以在题库编辑完成后使用组合算法生成试卷题目关联表,数量级约为10^343,比较大,一次操作可能就把内存玩爆了,应该分批次生成,最好是在夜深人静的时候自己默默的执行。生成后放到数据库中,在用户读取试卷的时候就从关联表中随机取一个就可以了。读取后将该记录的软锁定标志位设置为锁定,防止他人使用该试卷。这种做法一般是使用一台专门的服务器进行关联表的生成,生成后在生产服务器上运行sql。 方案二:还有一个方案就是先判断参加考试的人有多少,不多的话那么大的数量级,重复的可能性太小了,直接采用算法随机生成就好了,实在不放心,将组合算法中的位移标记缓存起来,等下次生成试卷的时候继续使用缓存中的标记继续算法。这种方案感觉会比第一种优化一些,即没有占用太多的数据库资源,也没有占用太多的缓存资源,仅仅是缓存了算法中的几个标记值而已。再保险一些就是将标记也存入数据库,防止缓存失效或是其它原因造成的标记丢失。
ITjavaman 2016-09-27
  • 打赏
  • 举报
回复
引用 2 楼 Goskalrie 的回复:
[quote=引用 1 楼 ITjavaman 的回复:] 100000*99999*99998*...*99991/1*2*3*...*100=你自己算- - 。[/color]
提示:是99901而不是99991。 在这个板块问的就是代码,你就不写了……仍然感谢你的回答,结贴时会给分。[/quote] 思路给你了,代码例子网上也一把,不要当伸手党

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧