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