设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: jiek
打印 上一主题 下一主题

如何随机不重复读取一个数组??

[复制链接]
11#
发表于 2002-12-30 22:00:00 | 只看该作者
不重复读取一个数组(用100个变量来做选取标志):
Public Sub ShowRnd()
'NumCount 为原始数组维数,SelCount 为随机数组维数
Const NumCount = 100, SelCount = 100
'NumAry 为原始数组,GetAry 为随机数组,selAry 数组存储已取过的数组下标
Dim NumAry(NumCount) As Long, GetAry(SelCount) As Long, selAry(SelCount) As Long
Dim i As Long, j As Long
'为原始数组赋值
For i = 1 To NumCount
    NumAry(i - 1) = i * 10  '也可以赋其它值或字段值
Next
'为随机数组取值
For i = 0 To SelCount - 1
    Do
        selAry(i) = Int(Rnd() * NumCount)  '取新下标
        '逐个与已取过的数组下标比较
        For j = 0 To i - 1
            If selAry(i) = selAry(j) Then '重复取值
                Exit For
            End If
        Next j
        If j = i Then Exit Do  '如果 j<i, 则重新执行循环,再取新下标
    Loop
    GetAry(i) = NumAry(selAry(i))  '用取得的新下标为随机数组赋值
    if SelCount<100 then Debug.Print GetAry(i)   '在调试窗口显示随机数组的值
Next i
Debug.Print "Finish"   '随机数组取值完成
End Sub

'当数组较大,并且要(或接近)全部选取时,就不宜用这种方法,用表加标志不失为一个好办法,也可以用我给出的第一种算法(至少是稳定的,时间是固定的)。
12#
发表于 2002-12-31 06:37:00 | 只看该作者

绝对最优算法!!!

由数组取部分(全部)不重复随机数组的算法:
[代码最简洁,变量最少,循环次数最少,有能改一字者,赏千金!!![em02]]

Private Sub 命令0_Click()
Const AllCount = 100, GetCount = 50
Dim a(1 To AllCount) As Long
Dim i, Temp, RndNum As Long
'赋值给数组
For i = 1 To AllCount
    a(i) = i
Next
'给数组随机排序
For i = 1 To GetCount
    RndNum = Int(Rnd * (AllCount + 1 - i)) + i '产生一个i到100之间的随机数
    Temp = a(i)
    a(i) = a(RndNum)
    a(RndNum) = Temp
    Debug.Print a(i)
Next i
End Sub


[此贴子已经被Trynew于2002-12-30 22:37:20编辑过]

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-30 01:44 , Processed in 0.093227 second(s), 23 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表