Office中国论坛/Access中国论坛

标题: 生成100个不重复的随机数 [打印本页]

作者: 盗到稻    时间: 2008-8-2 23:45
标题: 生成100个不重复的随机数
Private Sub Command5_Click()
Dim rn() As String
rn = Split(fncRndNum(1, 100, 100), ",")
Text1 = Join(rn)
End Sub

Private Function fncRndNum(llMinNum As Long, llMaxNum As Long, Num As Long) As String
    Dim lsTemp As String
    Dim lsNum As String
    Do While Num > 0
        lsNum = Int(Rnd * (llMaxNum - llMinNum + 1)) + llMinNum
        If InStr(lsTemp, lsNum) = 0 Then
            lsTemp = IIf(lsTemp = "", "", lsTemp & ",") & lsNum
            Num = Num - 1
        End If
    Loop
    fncRndNum = lsTemp
End Function

剩下9个数的时候一直死循环,但是改为101到200或其它高于101以上的数却没有问题,怪怪的,偶看不出什么问题,各位大侠分析析看看。
作者: t小宝    时间: 2008-8-3 08:37
如C版所说,楼主的方法有点慢。至于去掉重复,我也改一下:
  1. '生成100个不重复的随机数
  2. Private Sub Command5_Click()
  3. Dim rn() As String
  4. rn = Split(fncRndNum(1, 100, 100))
  5. Text1 = Join(rn)
  6. End Sub

  7. Private Function fncRndNum(llMinNum As Long, llMaxNum As Long, Num As Long) As String
  8.     Dim lsTemp As String
  9.     Dim lsNum As String
  10.     lsTemp = " "
  11.     Do While Num > 0
  12.         lsNum = Int(Rnd * (llMaxNum - llMinNum + 1)) + llMinNum & " "
  13.         If InStr(lsTemp, " " & lsNum) = 0 Then
  14.             lsTemp = lsTemp & lsNum
  15.             Num = Num - 1
  16.         End If
  17.     Loop
  18.     fncRndNum = Trim(lsTemp)
  19. End Function
复制代码

[ 本帖最后由 t小宝 于 2008-8-3 08:41 编辑 ]
作者: ui    时间: 2008-8-3 10:20
在1-100随机,也就是1-100的数都会全用到,对吗
作者: 盗到稻    时间: 2008-8-3 17:32
谢谢各位,这是绝简单速度的不重复随机数。先把1到100顺序存入a[]数组中,随机生成一个1到100之间的整数b,交换a[1]与a;再随机生成一个2到100之间的整数b,交换a[2]与a...最后随机生成一个1到100之间的整数b,交换a[30]与a,a[]数组前100个数即所求。
用VB编程如下:
Private Sub Form_Load()
Dim i, j, a(100) As Integer
For i = 1 To 100
a(i) = Str(i)
Next
Text1 = ""
For i = 1 To 100
j = (100 - i) * Rnd + i
a(0) = a(j)
a(j) = a(i)
a(i) = a(0)
Text1 = Text1 & Chr(32) & a(i)
Next
End Sub


但我问的并不是这个,而是不明白为什么1到100时会假死,而101到200以上却不会
作者: 咱家是猫    时间: 2008-8-3 18:49
Do While Num > 0
100-100=0
200-100=100
问题应该出在这里.
作者: 咱家是猫    时间: 2008-8-3 18:52
lsNum = Int(Rnd * (llMaxNum - llMinNum + 1)) + llMinNum
应该是大于1且<100吧?
这里面有100个整数值吗?
作者: tz-chf    时间: 2008-8-3 23:42
原帖由 ui 于 2008-8-3 10:20 发表
在1-100随机,也就是1-100的数都会全用到,对吗


同意!!问题本身就是无意义
作者: 盗到稻    时间: 2008-8-4 17:01
原帖由 tz-chf 于 2008-8-3 23:42 发表


同意!!问题本身就是无意义

怎么会没有意义呢,例如100道题,打乱来随机出题,不重复直到全部出完为止,你能说这没意义?
作者: tz-chf    时间: 2008-8-4 17:29
原帖由 盗到稻 于 2008-8-4 17:01 发表

怎么会没有意义呢,例如100道题,打乱来随机出题,不重复直到全部出完为止,你能说这没意义?


如何是这种情况,你的算法就太差了。100道题打乱顺序也没多大意思。

[ 本帖最后由 tz-chf 于 2008-8-4 17:30 编辑 ]
作者: chenwm1973    时间: 2008-8-4 18:09
原帖由 盗到稻 于 2008-8-4 17:01 发表

怎么会没有意义呢,例如100道题,打乱来随机出题,不重复直到全部出完为止,你能说这没意义?


若是用于出题,一次仅显示一题,那么应该是去除法。把已经抽到的题排除在外,在没有抽到的题中再次选择。
若仅有100题,打乱后全部显示出来,这个跟按顺序全部显示是一样的,是没有意义的。
再说,随机出题,题库不可能全部用完。
[:31] [:31]
作者: ganrong    时间: 2008-8-4 18:12
提示: 作者被禁止或删除 内容自动屏蔽
作者: tz-chf    时间: 2008-8-4 19:43
13楼正解
作者: 盗到稻    时间: 2008-8-5 09:21
14楼说得好,并不是一次显示100道题,而是一次随机出一道题,答完后再随机出下一道题,直到循环所有题,像14楼granrong所说的那样,第一次,跟下一次,或每个人接收的随机题不是一样的,你第一次可能是89,34,2,56,......下一次或别人可能是4,23,99,67,89,......., 不过13楼所说的去除法有兴趣,平时买彩票有讲去除法,但程序算法上还没接触过,小昕能否说一说或贴个程序上来,谢谢大家!
作者: hi-wzj    时间: 2008-8-5 10:02
表1,题库。
表2,已选出的题目。
查询1,表1表2的不匹配查询,即待选的题目库。

随机数的算法:int(rnd()*dcount("*","查询1")    如果题库数不太变动,也可将dcount("*","查询1")做个变量保存每运行一次减一也可。
dao到查询1中取出随机数所指的记录号,追加到表1中。
作者: 盗到稻    时间: 2008-8-5 10:22
原帖由 hi-wzj 于 2008-8-5 10:02 发表
表1,题库。
表2,已选出的题目。
查询1,表1表2的不匹配查询,即待选的题目库。

随机数的算法:int(rnd()*dcount("*","查询1")    如果题库数不太变动,也可将dcount("*","查询1")做个变量保存每运行一次减一也 ...


谢谢版主,就100道题,就不用数据库功能了,现在就像看看小昕简单的去除法算法
作者: hi-wzj    时间: 2008-8-5 10:28
到待选的题目库中取记录即是去除算法的运用。
作者: tz-chf    时间: 2008-8-5 10:45
原帖由 hi-wzj 于 2008-8-5 10:28 发表
到待选的题目库中取记录即是去除算法的运用。

取到记录后待选表中还要删除
作者: hi-wzj    时间: 2008-8-5 13:44
原帖由 tz-chf 于 2008-8-5 10:45 发表

取到记录后待选表中还要删除



查询1,表1表2的不匹配查询




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3