Office中国论坛/Access中国论坛

标题: 关于随机产生不重复数 [打印本页]

作者: chuang0321    时间: 2010-1-20 10:15
标题: 关于随机产生不重复数
前天,同事要我帮忙做一个舒尔特方格的测试软件,我答应了。
在该软件中需要生成1-25以内的随机不重复数。根据网上搜寻的结果,我利用rud()函数。
可是,不知道什么问题,有些时候还是会生成重复数据。所以我只好利用了笨方法重新生成随机数据。

坛子里面的高手,能否帮我看看问题在什么地方。如果能够解决生成重复数问题,我这个程序就可以大大简化了。[attach]41249[/attach]
作者: 方漠    时间: 2010-1-20 11:50
见附件,新加了一个按钮,和你原来的代码没有多大联系,不过还是要用到那个TABLE.
另外,我的算法越往后越费时, 即25个只剩1个未选中时, 需求随机直至那个选中为止. 你可以自己优化一下,只填20个文本框,后面的5个数按顺序填入剩下的5个文本框就行.
作者: 方漠    时间: 2010-1-20 11:53
自己测了一下,汗,18秒,中等水平.
作者: chuang0321    时间: 2010-1-20 14:05
谢谢方漠版主,使用“Me.Controls("Text" & I) ”后代码少多了(我一直再找这个代码写法)。
我曾有一个想法,就是每提取一次数据,就产生一个查询,查询没有被使用的数字后生成带自动编号的表,然后再在此表中随机提取一个数,如此类推。这样一来,就肯定不会出现重复数的问题了。但是,我没有解决查询后增加自动编号字段的问题。
作者: fan0217    时间: 2010-1-21 19:55
如何产生不重复的随机数?
先创建个类模块:Random

类模块代码如下:

  1. Dim c As Collection
  2. '初始化,定义产生随机数的最小值和最大值
  3. Public Sub Init(min As Integer, max As Integer)
  4. Set c = New Collection
  5. Dim i As Integer
  6.     For i = min To max
  7.         c.Add i
  8.     Next
  9. End Sub
  10. '产生不重复的随机数
  11. Public Function RandomNext() As Integer
  12. Dim i As Integer
  13. Dim number As Integer, upperbound As Integer
  14.     upperbound = c.Count
  15.     If upperbound > 0 Then
  16.         number = Int((upperbound) * Rnd + 1)
  17.         RandomNext = CInt(c.Item(number))
  18.         c.Remove (number)
  19.     Else
  20.         RandomNext = 0
  21.     End If
  22. End Function
  23. Private Sub Class_Terminate()
  24.     Set c = Nothing
  25. End Sub
复制代码


测试:

  1. Dim r As New Random
  2.   
  3. Sub Test() '请先运行Init
  4. Dim i As Integer
  5.     For i = 0 To 10
  6.        Debug.Print r.RandomNext
  7.     Next
  8. End Sub
  9. Sub Init()
  10.     r.Init 1, 100
  11. End Sub
复制代码





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