ACCESS随机抽题

方法一:有人用如下代码以记录总数为极大值来首先提取出指定数量的随机数,然后以这些随机数做为记录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&")"
……


PS:网上能找到的好像就这些了,我逐一试了下,好像都不好用
直接用rnd(id)在access中运行没问题,但代码中调用不行
SELECT TOP N这种也不行,总是取到固定的那几个
其实多条件也是可以用UNION,但是记录集就不能更新了
用下面代码生成随机ID,还要再结合select in这样子就OK了
Private Function getRndID(zhangjie As Integer, sNum As Integer) As String
    Dim strID As String
    Dim i As Integer
    Randomize
    rsMDB.Open "select id from shiti where zhangjie=" & Trim$(Str(zhangjie)) & " order by rnd(-(ID+" & Rnd() & "))", connMDB
    Do While Not rsMDB.EOF
        i = i + 1
        strID = strID & rsMDB("id") & ","
        rsMDB.MoveNext
        If i >= sNum Then Exit Do
    Loop
    rsMDB.Close
    
    getRndID= strID
End Function



PS:不清楚怎以回事,上边的代码有时也会不太好用,再附上一段数组随机排序的代码
Private Function XOrder(ByRef OldOrder() As String) As String()                '打乱动态数组顺序
    Dim NewOrder() As String, i&, j&, k&, kk&
    k = UBound(OldOrder): ReDim NewOrder(k)
    Randomize
    For i = 0 To k - 1
        j = Fix(Rnd * (UBound(OldOrder) + 1))
        NewOrder(i) = OldOrder(j)
        kk = UBound(OldOrder)
        OldOrder(j) = OldOrder(kk)
        ReDim Preserve OldOrder(kk - 1)
    Next
    NewOrder(i) = OldOrder(0)
    XOrder = NewOrder
End Function
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值