关于如何生成随机记录

方法一:
在ACCESS环境中用rnd函数解决,以下查询展示了如何从表中随机抽取10条记录
SELECT top 10 * FROM tbl1 ORDER BY Rnd(id)
另外, Rnd(id) 其中的id只是为了提供一个种子,可以利用其他任何数值来完成
id字段是自动编号字段,也可以用其他字段代替,只要能生成数值就行。
如果每次RND得到的结果都一样,那是因为没有使用 Randomize 语句来初始化随机数生成器。

方法二:
在ASP、VB中无法使用上述方法,可以参考使用adodb.recordset.recordcount 属性以及 adodb.recordset.AbsolutePosition 以及 RND 函数来解决问题。
Function RndID()
    Dim rs As New ADODB.Recordset
    Dim strsql As String
    strsql = "select * from tbl1"
    rs.CursorLocation = adUseClient
    rs.Open strsql, CurrentProject.Connection, 2, 3
    '在Access中可以使用 CurrentProject.Connection,
    '其他语言中可以用 ADODB.CONNECTION对象。
   
    Dim i As Long
    Dim lngCount As Long
    Dim lngRnd As Long
    lngCount = rs.RecordCount
    '一下取前10条随机记录
    For i = 1 To 10
        lngRnd = Int((lngCount * Rnd) + 1)
        rs.AbsolutePosition = lngRnd
        Debug.Print rs("id")
    Next
End Function


方法三:
用当前 TIME 做种子生成随机数。如果时间重复最终还是重复,没有从根本上解决问题,说白了还是种子的问题。要不重复就要彻底解决种子的问题,如果能取得毫秒级时间就基本能解决了
或者建议在组织 SQL 语句的时候有意插入一个 VB 函数生成的随机值作为种子也可以
Dim sql
Dim RNUM
Randomize
RNUM = Rnd
sql = "select top 1 * from tbl1 order by rnd(" & RNUM & "-id)"

其中,方法三已经经过验证,可以使用。

附:
关于用 SQL 得到 Access 的随机记录集    
此问题早已有人提出,解决的方法也非原创。写这篇东西,意在共同探讨。毕竟目前还没有非常满意的结论。先说说现在网上大多数转贴是这样说的:

SQL Server 2000:
SELECT TOP n * FROM tanblename ORDER BY NEWID()

Access:
SELECT TOP n * FROM tanblename ORDER BY rnd([一个自动编号字段])

SQL 有了 NEWID() 就无须多讲拉,但 Access 中没有,所以寄望于 RND,实际上这条语句在 Access 中的“查询”中是可以运行并得到随机结果的,但在 ASP 中却无法得到预期的随机效果——无论如何刷新得到的结果都是一样的(就算在语句前加上 Randomize 也一样于事无补)。

当然,也不少其他的解决方法,用数组的,用循环的……不好说不对,但总觉得跑题了。后来有另外的朋友试验出这个方法:表 TestTable,有自动编号字段 TestID,标题字段 TestTitle,随机取得5条纪录,用代码:

Randomize
SELECT TOP 5 [TestTitle] FROM [TestTable] ORDER BY Rnd(-(TestID+"&Rnd()&"))

实际上,我目前需要应用到随机纪录的地方就是用的这条语句,除此我没有其他更好的方法(但用过才知道,其实这条语句偶然会生成重复纪录的)。也许你会有更好的方法……

转载于:https://www.cnblogs.com/cole2295/archive/2009/07/11/1520997.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值