VB生成不重复随机数
VBVB 生成不重复的随机数生成不重复的随机数 VB 生成不重复的随机数 我的建议是:第一步、先做一个数组,存上这 35 个数(可以不是连续的数,也 可以是人名、字符串什么的) ;第二步、随机生成一个1-35 之间的数,输出;第 三步:把这个数和数组的第一个单元交换;第四步、从数组的第 2-35 之间随机 抽取第二个数,输出;第五步、把这随机抽取的第二个数和数组的第二个单元内 容呼唤;第六步、随机抽取第三个数,输出。 。 。 。 。重复到从第35-35 个数之间随 机抽取一个数,这时直接输出最后一个就行了。 程序如下(VB6) : 工程里默认的窗体上,画一个 Command1,粘贴程序: option explicit private vArray(1 to 35) as currency 定义数组个数 private sub command1_click() test end sub private sub InitArray() dim i as long 给数组赋值 for i=1 to 35 varray(i)=i next i end sub private sub Test() dim iStart as long dim iPos as long dim vTemp as currency dim sReturn as string InitArray randomize timer设置随机因子,使其每次运行程序的随机数都不一样 iStart=1 do iPos=int(rnd*(ubound(vArray)-iStart+1))+iStart 产生iStart到35 (35取自vArray 的上标)之间的整数 资料 sReturn=sReturn vArray(iPos) vbcrlf 输出 交换单元内容 vTemp=vArray(iStart) vArray(iStart)=vArray(iPos) vArray(iPos)=vTemp iStart=iStart+1 下次随机生成时,少生成一个 if iStart=ubound(vArray) then 最后一个了,直接输出 sReturn=sReturn vArray(ubound(vArray)) Exit Do end if if iStart7 then exit do 如果需要生成几个数,就把 7 改成几,大于数组元 素的个数,将输出速度的元素个数(这个例子是 35) Loop msgbox sReturn msgbox 输出结果 end sub ================================================================ ============================== 方法二 Private Sub Command1_Click() Dim a(35) As Integer For i = 0 To 35 way1: Randomize a(i) = Int(Rnd() * 36) + 1 If i 1 Then For p = 0 To i - 1 If a(p) = a(i) Then‘与前面的对比,如果有重复,重新随机 GoTo way1 End If Next p End If Print a(i);打印 Next i Print 打印 End Sub ================================================================ ========================== 方法三 如果楼主是要产生 0-9 等 10 个不重复的随机数的话,在随机数范围和个数相等 资料 的情况下,楼上的方法都无异于散弹打鸟。在最不利情况下时间将无限延长,特 别是对更多随机数的时候。 以下提供两种思路: 1.实际上我们只要确定了其中 9 个数字那么第 10 个数字根本不用去想; 确定 8 个,那么随机只在 2 个数之间,以此类推,使用 动态数组如 a(),先用 for 将 10 个数字加入,然后开始 rnd*ubound(a)取得其中一 个,放入数组 b,再将该数字从 a 数组中剔除。速度:(n+n^2)/2 2.只需要得到 10 个无序排列的数字即可,没必要去一直产生随机数,只要打乱 顺序即可。在数组 a 中加入 10 个数字,然后开始 for 循环 10 次,每次产生一个 10 以内的随机数,然后将循环次数 i 与随机数的位置互换。速度:n ================================================================ ================================ 方法四 关于随机数的不重复求取 Option Base 1 Private Sub Command1_Click() Randomize Timer Dim A(1 To 10) As Integer数组 M Dim B(1 To 8) As String数组 N Dim i As Integer, k As Integer, t As Integer For i = 1 To 10 A(i) = i Next For i = 1 To 10数组打乱 t = A(i) k = Fix(Rnd * 10) + 1 A(i) = A(k) A(k) = t Next For i = 1 To 8 从 M 中随机取出 N 个数,不重复 B(i) = A(i) Next Label1.Caption = Join(B(), , ) End Sub 方法五====================================================== Private Sub Command2_Click() Randomize Timer Dim Dimension(8) Dim i As Byte, j As Byte Randomize Timer 资料 For i = 1 To 8 Dimension(i) = Fix(Rnd * 10) + 1 Next i A:For i = 1 To 7 For j = i + 1 To 8 If Dimension(i) = Dimension(j) Then Dimension(i) = Fix(Rnd * 10) + 1 GoTo A End If Next j Next i Label1.Caption = Join(Dimension(), , ) End Sub Private Sub Command3_Click() End End Sub =============================================================== 方法六: (最快) 还有种方法是随机取数组中一个数,取出后将该元素与数组最后一个元素交换,然 后随机上限减一 然后就是字符串的速度了 .一次分配足够大的字符串 ,而不是用连接字符 串会快很多 Option Explicit Private