asp+access 实现随机出题怎么实现

时间:2022-08-30 18:13:03
想用asp+access做一个在线考试系统,请问如何实现随机从access数据库中抽题而不会重复呢?

21 个解决方案

#1


random函数用上。

想不重复的话 只有用一个数组保存你的试题id了
每当抽出一个id  就和数组中的id比较 如果相等,就不取出id了,不等的话 就取出id来。然后把这个不重复的id添加到那个数组中


或者像节约点时间:把抽出的题目id从小到大排序,然后取出重复的id

#2


方法一:有人用如下代码以记录总数为极大值来首先提取出指定数量的随机数,然后以这些随机数做为记录ID。 
VBScript代码:
dim n,j
dim su()
dim a,b,k
b=myrs.RecordCount
Randomize
redim su(index_N)
su(1)=Int((b * Rnd) + 1)
for n=2 to index_N
a=Int((b * Rnd) + 1)
for j=1 to n
      do while a=su(j)
          a=Int((b* Rnd) + 1)
          j=1         
      loop
next
su(n)=a
next 
  这种方式有一些问题,就是当主键ID不连续的话,有可能某些随机数不存在ID序列当中。另外ID的最大值与总的记录值不一定相等,这样有些记录ID会永远被忽略。

  方法二:有人采用一条SQL语句解决此问题
  select top 5 * From Table1 order by Rnd()*5
  这条语句可以随机从Access数据库中摄取5条记录。但是实际操作中,其生成的记录结果是固定的,失去了随机摄取记录的意义。

  方法三:有这样一种方法。
  利用随机数生成主键的记录ID
  yourstr="*1*3*4*6*12*...."
  然后用
sql="select top 10 * form yourdb where instr('*'&id&'*','"&yourstr&"')<>0"
yourstr
  可以生成随机数多一点大于所限定抽取的随机数为好。这样可以排除记录不足的情况。
  此方法也不太好,而且采用InStr语句,不能利用索引优化,对资源有一定的消耗。

  方法四:
  代码实现如下:
<%
   n=10    ''取任意10条记录
   set rs = server.CreateObject ("adodb.recordset")
      sql = "select * from table"
      rs.open sql,conn,1,1
      count=rs.recordcount   ''记录总数
      IF Count<>empty Then
         Randomize       
        for i = 1 to n       ''循环n次
           num=Fix(Rnd*count) ''num便是随机产生的记录行数,用Fix(),使其不会大于count值。
           rs.move num    ''移到改随机行
           Response.write rs(0)   ''出该条记录
        rs.movefirst     ''别忘了再把指针移到第一条
        next
      End IF
      rs.close
   set rs = nothing
%>
这个方式感觉上比较好些。

  方法五:
  此方法应该算是比较接近于SQL Server的用法了。
  代码:
randomize '得到随机的种子,9999根据你的记录数量级调整,具体调到你出来的记录集随机序列均化
seed=round(rnd*9999)
'以下两种方法都可以,id是主键自增字段
Sql="select id,分值 from table where order by rnd(-"&seed&"-id-"&seed&")"
……

#3


感谢楼上的两位朋友的建议,期望有更多的朋友出出主意

#4


顶一下!

#5


SELECT top 10 article.*, Rnd(id) AS RandNumber FROM article ORDER BY Rnd(id)
这是我随机取新闻表中10条记录的SQL,希望你有帮助

#6


SELECT top 10 article.* FROM article ORDER BY newid 

#7


asp+access获取不重复的随机记录: http://www.bhcode.net/article/20090325/4498.html

#8


我这里有一个现成的,不过是sql server的。刚刚给一个事业单位用过,180个人同时考试,倒是运行的挺顺畅。需要的话给我发邮件liangzhifa@gmail.com

#9


谢谢8楼的朋友,好好研究下您的代码,谢谢!

#10


顶一下

#11


最好是用在表里面加一条标识字段,用来标识是否已经出过
接着,用SELECT top 10 FROM article  where flage and Rnd(id) 
flage是标识字段,用过了为false没用地为true

#12


将已经选出的题目,打上标记,下次再抽题的时候,排除已经出过的题目。

#13


你的题目表应该有个数值型的id列,然后用随机函数生成一个随机数,然后查询的时候把这个随机条件带上就是了。

#14


顶一下!

#15


感谢大家的帮助,准备今晚结贴

#16


我是循环来做的。然后判断是否重复。

#17


二楼的方案貌似都不行,对于随机出来的重复记录无判断。
我在弄个JSP的类似的这么个系统
大体方案是,
1.判断临时表是否存在
2.将题库中的记录存入临时表,生成随机数作为记录游标,打印该记录(即题目),从临时表中删除该记录,根据待出题数执行循环。
3.删除临时表。

#18


引用 11 楼 shenymce 的回复:
最好是用在表里面加一条标识字段,用来标识是否已经出过
接着,用SELECT top 10 FROM article  where flage and Rnd(id)
flage是标识字段,用过了为false没用地为true

不可行
未考虑并发情况,如果两个用户同时考试,出过的题就不能出了?

#19


引用 13 楼 tfpeixun 的回复:
你的题目表应该有个数值型的id列,然后用随机函数生成一个随机数,然后查询的时候把这个随机条件带上就是了。

肯定会有ID了,即使没有也可以用游标。

#20


看又有了这么热烈的讨论,欢迎有更多的朋友来参与讨论!延长一天结贴

#21


引用 5 楼 number123456 的回复:
SELECT top 10 article.*, Rnd(id) AS RandNumber FROM article ORDER BY Rnd(id)
这是我随机取新闻表中10条记录的SQL,希望你有帮助


然后把答过的题目的id写成数组如(45,74,2,66)写到cookie里,然后在上边的语句里加上where id not in (45,74,2,66)

#1


random函数用上。

想不重复的话 只有用一个数组保存你的试题id了
每当抽出一个id  就和数组中的id比较 如果相等,就不取出id了,不等的话 就取出id来。然后把这个不重复的id添加到那个数组中


或者像节约点时间:把抽出的题目id从小到大排序,然后取出重复的id

#2


方法一:有人用如下代码以记录总数为极大值来首先提取出指定数量的随机数,然后以这些随机数做为记录ID。 
VBScript代码:
dim n,j
dim su()
dim a,b,k
b=myrs.RecordCount
Randomize
redim su(index_N)
su(1)=Int((b * Rnd) + 1)
for n=2 to index_N
a=Int((b * Rnd) + 1)
for j=1 to n
      do while a=su(j)
          a=Int((b* Rnd) + 1)
          j=1         
      loop
next
su(n)=a
next 
  这种方式有一些问题,就是当主键ID不连续的话,有可能某些随机数不存在ID序列当中。另外ID的最大值与总的记录值不一定相等,这样有些记录ID会永远被忽略。

  方法二:有人采用一条SQL语句解决此问题
  select top 5 * From Table1 order by Rnd()*5
  这条语句可以随机从Access数据库中摄取5条记录。但是实际操作中,其生成的记录结果是固定的,失去了随机摄取记录的意义。

  方法三:有这样一种方法。
  利用随机数生成主键的记录ID
  yourstr="*1*3*4*6*12*...."
  然后用
sql="select top 10 * form yourdb where instr('*'&id&'*','"&yourstr&"')<>0"
yourstr
  可以生成随机数多一点大于所限定抽取的随机数为好。这样可以排除记录不足的情况。
  此方法也不太好,而且采用InStr语句,不能利用索引优化,对资源有一定的消耗。

  方法四:
  代码实现如下:
<%
   n=10    ''取任意10条记录
   set rs = server.CreateObject ("adodb.recordset")
      sql = "select * from table"
      rs.open sql,conn,1,1
      count=rs.recordcount   ''记录总数
      IF Count<>empty Then
         Randomize       
        for i = 1 to n       ''循环n次
           num=Fix(Rnd*count) ''num便是随机产生的记录行数,用Fix(),使其不会大于count值。
           rs.move num    ''移到改随机行
           Response.write rs(0)   ''出该条记录
        rs.movefirst     ''别忘了再把指针移到第一条
        next
      End IF
      rs.close
   set rs = nothing
%>
这个方式感觉上比较好些。

  方法五:
  此方法应该算是比较接近于SQL Server的用法了。
  代码:
randomize '得到随机的种子,9999根据你的记录数量级调整,具体调到你出来的记录集随机序列均化
seed=round(rnd*9999)
'以下两种方法都可以,id是主键自增字段
Sql="select id,分值 from table where order by rnd(-"&seed&"-id-"&seed&")"
……

#3


感谢楼上的两位朋友的建议,期望有更多的朋友出出主意

#4


顶一下!

#5


SELECT top 10 article.*, Rnd(id) AS RandNumber FROM article ORDER BY Rnd(id)
这是我随机取新闻表中10条记录的SQL,希望你有帮助

#6


SELECT top 10 article.* FROM article ORDER BY newid 

#7


asp+access获取不重复的随机记录: http://www.bhcode.net/article/20090325/4498.html

#8


我这里有一个现成的,不过是sql server的。刚刚给一个事业单位用过,180个人同时考试,倒是运行的挺顺畅。需要的话给我发邮件liangzhifa@gmail.com

#9


谢谢8楼的朋友,好好研究下您的代码,谢谢!

#10


顶一下

#11


最好是用在表里面加一条标识字段,用来标识是否已经出过
接着,用SELECT top 10 FROM article  where flage and Rnd(id) 
flage是标识字段,用过了为false没用地为true

#12


将已经选出的题目,打上标记,下次再抽题的时候,排除已经出过的题目。

#13


你的题目表应该有个数值型的id列,然后用随机函数生成一个随机数,然后查询的时候把这个随机条件带上就是了。

#14


顶一下!

#15


感谢大家的帮助,准备今晚结贴

#16


我是循环来做的。然后判断是否重复。

#17


二楼的方案貌似都不行,对于随机出来的重复记录无判断。
我在弄个JSP的类似的这么个系统
大体方案是,
1.判断临时表是否存在
2.将题库中的记录存入临时表,生成随机数作为记录游标,打印该记录(即题目),从临时表中删除该记录,根据待出题数执行循环。
3.删除临时表。

#18


引用 11 楼 shenymce 的回复:
最好是用在表里面加一条标识字段,用来标识是否已经出过
接着,用SELECT top 10 FROM article  where flage and Rnd(id)
flage是标识字段,用过了为false没用地为true

不可行
未考虑并发情况,如果两个用户同时考试,出过的题就不能出了?

#19


引用 13 楼 tfpeixun 的回复:
你的题目表应该有个数值型的id列,然后用随机函数生成一个随机数,然后查询的时候把这个随机条件带上就是了。

肯定会有ID了,即使没有也可以用游标。

#20


看又有了这么热烈的讨论,欢迎有更多的朋友来参与讨论!延长一天结贴

#21


引用 5 楼 number123456 的回复:
SELECT top 10 article.*, Rnd(id) AS RandNumber FROM article ORDER BY Rnd(id)
这是我随机取新闻表中10条记录的SQL,希望你有帮助


然后把答过的题目的id写成数组如(45,74,2,66)写到cookie里,然后在上边的语句里加上where id not in (45,74,2,66)