关于随机抽题问题(100分)

  • 主题发起人 主题发起人 victorfjb
  • 开始时间 开始时间
V

victorfjb

Unregistered / Unconfirmed
GUEST, unregistred user!
有谁能告诉我从题库中随机抽题的比较简单有效的算法?100分送上!
 
我曾做过一个考试软件,里面分三种类型题目,我的做法是每一种类型都按这种
算法:该类型题库总数/该类型考试题数,得出该类型题目的步长,然后取一个在题
库总数范围之的随机数(可用系统的随机数或gettickcount()取系统流逝时间对题
库总数取模),然后在随机数位置取第一题,然后加上计算得出的步长(加上后的值
如果超出题库总数,将其减去题库总数),取第二题,接下去自然就是再加上步长,取第
三、四......题了,这种方法不会取到重复的题目,不同考生之间所取的题目也不
会相同。只要题库数量够大,不同考生取相同类型题目时,取题相同的情况也很少可能
出现。
 
又源程序吗?
 
简单!
怎样构造 随机取一条记录的SQL语句
select top 1 * from table1 order by newid()
~~~~~~~~~~~~~~~这只是一个函数,你不用管的!照抄就是!
 
randomized;
label1.caption:=inttostr(random(总题号));//题号为整型常数,得到随机题号
根据得到题号列题
 
我觉得可以通过记录的ID取。如果天真的方法行得通,那是最好的方法了![:D]
 
to 天真:
如果数据库中的记录足够多,在调用newid()一定的次数后会不会产生同样的记录?
 
不会,NEWID是一个随机函数!
 
先将题目分组,比如按类型或难度分
然后根据设定从每组中取题数随机抽取
NEWID有可能会产生相同的数罢,还是设置一个标记表示是否已抽过
当抽题完成后,将所有记录的这个标记还原为未抽过
 
如果抽过的就不能再用的话就这样写!
select top 1 * from table1 where 标志位<>'1' order by newid()
 
李衍智兄:笑什么????:)
 
to:天真
当时我就怀疑newid,现在仍存怀疑。他到底能不能保证分布均匀。不知道,
应该找些资料看看。
 
呵,这个我也不清楚,当时我试了一下,跟RANDOM效果差不多,其实还是我们的那个方法好!
不过这个写起来简单!:)
 
to 萧月禾,天真:
肯定不能按照你们的说法,如果参加考试的人很多会出现没题可选的情况!
 
抽过的就不能再用是针对一个人的情况,但是对同时考试的不同的人还是可以的
to 天真:你们是不是还有其他的方法?:)
 
呵,那就行了,至于如何筛选是你自己条件判断的问题了,跟此题无关!
还有其它方法为:
SELECT top 1 f.*
FROM f,
(SELECT COUNT(*) AS cou
FROM f) b
WHERE (id <= CAST((RAND() * b.cou AS int))+min(id))
order by id desc
 
那怎么办?
要随机抽取还要保证均匀分布 有函数式吗?
 
后退
顶部