1. 论坛系统升级为Xenforo,欢迎大家测试!
    排除公告

简单高效:不重复随机读取数据库记录

本帖由 小叶2006-01-22 发布。版面名称:后端开发

  1. 小叶

    小叶 New Member

    注册:
    2005-09-04
    帖子:
    17,941
    赞:
    33
    实现方法:
    1。通过recordset游标可移动的特性,在已打开记录集里移动到随机位置读取记录。而且可以将就使用页面中已打开的RS对象。
    2。将出现过的随机数保存到一个字符串中,通过instr函数来检查是否重复,重复则递归调用函数至不重复。


    数据库打开查询若干,省略... ...
    Set rs = Server.CreateObject("Adodb.RecordSet")
    rs.open sql,conn,1,1DIM Appeared
    Call DisRndRecord(10,rs.recordCount)'调用函数该位置显示记录
    '################SUBS################
    '#DisRndRecord(DisNum,rsBound)
    '#参数DisNum:显示数量
    '#参数rsBound:随机数产生范围
    Sub DisRndRecord(DisNum,rsBound)
    DIM i,ThisRnd
    If rsBound < DisNum Then DisNum = rsBound'记录总数小于要抽取记录条数的情况
    For i = 0 To DisNum - 1
    ThisRnd = GetRnd(rsBound)'取得一个不重复的随机数
    rs.Move(ThisRnd)'游标移动到随机数位置数读取
    Response.Write("<br>("&rs("id")&")"&rs("Title"))
    rs.Move(-ThisRnd)
    Next
    End Sub
    '# 函数GetRnd(bound)返回一个不重复的随机数字
    '#参数bound:随机范围
    Function GetRnd(bound)
    DIM ranNum
    Randomize()
    ranNum=int(bound*rnd)
    If Instr(Appeared,"["&ranNum&"]") Then'产生的随机数是否出现过
    ranNum = getRnd(bound)
    End If
    Appeared = Appeared & "["&ranNum&"]"'记录已出现的随机数
    GetRnd = ranNum
    End Function
     
  2. 老林

    老林 New Member

    注册:
    2005-09-06
    帖子:
    10,580
    赞:
    36
  3. 小叶

    小叶 New Member

    注册:
    2005-09-04
    帖子:
    17,941
    赞:
    33
    靠,我刚发。
     
  4. 老林

    老林 New Member

    注册:
    2005-09-06
    帖子:
    10,580
    赞:
    36
    我也是刚顶的
     
  5. 小叶

    小叶 New Member

    注册:
    2005-09-04
    帖子:
    17,941
    赞:
    33