vb生成不重复的随机数

上传人:F****n 文档编号:102748810 上传时间:2019-10-04 格式:DOCX 页数:12 大小:18.15KB
返回 下载 相关 举报
vb生成不重复的随机数_第1页
第1页 / 共12页
vb生成不重复的随机数_第2页
第2页 / 共12页
vb生成不重复的随机数_第3页
第3页 / 共12页
vb生成不重复的随机数_第4页
第4页 / 共12页
vb生成不重复的随机数_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《vb生成不重复的随机数》由会员分享,可在线阅读,更多相关《vb生成不重复的随机数(12页珍藏版)》请在金锄头文库上搜索。

1、VB生成不重复的随机数 VB生成不重复的随机数 我的建议是:第一步、先做一个数组,存上这35个数(可以不是连续的数,也可以是人名、字符串什么的);第二步、随机生成一个1-35之间的数,输出;第三步:把这个数和数组的第一个单元交换;第四步、从数组的第2-35之间随机抽取第二个数,输出;第五步、把这随机抽取的第二个数和数组的第二个单元内容呼唤;第六步、随机抽取第三个数,输出。重复到从第35-35个数之间随机抽取一个数,这时直接输出最后一个就行了。程序如下(VB6):工程里默认的窗体上,画一个Command1,粘贴程序:option explicitprivate vArray(1 to 35) a

2、s currency '定义数组个数private sub command1_click()testend subprivate sub InitArray()dim i as long'给数组赋值for i=1 to 35varray(i)=inext iend subprivate sub Test() dim iStart as longdim iPos as longdim vTemp as currencydim sReturn as stringInitArrayrandomize timer '设置随机因子,使其每次运行程序的随机数都不一样iStart=1

3、doiPos=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)=vTempiStart=iStart+1 '下次随机生成时,少生成一个if iStart>=ubound(vArray) then '最后一个了,直接输出sR

4、eturn=sReturn & vArray(ubound(vArray)Exit Doend ifif iStart>7 then exit do '如果需要生成几个数,就把7改成几,大于数组元素的个数,将输出速度的元素个数(这个例子是35)Loopmsgbox sReturn 'msgbox 输出结果end sub'='方法二Private Sub Command1_Click()Dim a(35) As IntegerFor i = 0 To 35way1:Randomizea(i) = Int(Rnd() * 36) + 1If i >

5、; 1 ThenFor p = 0 To i - 1If a(p) = a(i) Then '与前面的对比,如果有重复,重新随机GoTo way1End IfNext pEnd IfPrint a(i); '打印Next iPrint "" '打印End Sub'='方法三如果楼主是要产生0-9等10个不重复的随机数的话,在随机数范围和个数相等的情况下,楼上的方法都无异于散弹打鸟。在最不利情况下时间将无限延长,特别是对更多随机数的时候。以下提供两种思路:1.实际上我们只要确定了其中9个数字那么第10个数字根本不用去想; 确定8个,那么

6、随机只在2个数之间,以此类推,使用动态数组如a(),先用for将10个数字加入,然后开始rnd*ubound(a)取得其中一个,放入数组b,再将该数字从a数组中剔除。速度:(n+n2)/22.只需要得到10个无序排列的数字即可,没必要去一直产生随机数,只要打乱顺序即可。在数组a中加入10个数字,然后开始for循环10次,每次产生一个10以内的随机数,然后将循环次数i与随机数的位置互换。速度:n'='方法四关于随机数的不重复求取Option Base 1Private Sub Command1_Click()Randomize TimerDim A(1 To 10) As Int

7、eger '数组MDim B(1 To 8) As String '数组NDim i As Integer, k As Integer, t As IntegerFor i = 1 To 10A(i) = iNextFor i = 1 To 10 '数组打乱t = A(i)k = Fix(Rnd * 10) + 1A(i) = A(k)A(k) = tNextFor i = 1 To 8 '从M中随机取出N个数,不重复B(i) = A(i)NextLabel1.Caption = Join(B(), " , ")End Sub'方法五

8、=Private Sub Command2_Click()Randomize TimerDim Dimension(8)Dim i As Byte, j As ByteRandomize TimerFor i = 1 To 8Dimension(i) = Fix(Rnd * 10) + 1Next iA: For i = 1 To 7For j = i + 1 To 8If Dimension(i) = Dimension(j) ThenDimension(i) = Fix(Rnd * 10) + 1GoTo AEnd IfNext jNext iLabel1.Caption = Join(D

9、imension(), " , ")End SubPrivate Sub Command3_Click()EndEnd Sub'= '方法六:(最快)还有种方法是随机取数组中一个数,取出后将该元素与数组最后一个元素交换,然后随机上限减一然后就是字符串的速度了.一次分配足够大的字符串,而不是用&连接字符串会快很多Option ExplicitPrivate Declare Function timeGetTime Lib "winmm.dll" () As LongPrivate Const MAX_N = 10000 - 1 &#

10、39;在1(MAX_N+1)的数字中取Private Sub Command1_Click()Dim Ary(MAX_N) As LongDim i&, n&, p&, t&, ps&Dim s$, sTemp$t = timeGetTime'初始化For i = 0 To MAX_NAry(i) = i + 1NextRandomize' '计算并为s分配足够的大小,下面是当n=MAX_N+1时最终的s的长度的精确值' i = MAX_N + 1: p = 0: ps = 9' Do Until i <=

11、9' p = p + 1' n = n + ps * p' ps = ps * 10' i = i 10' Loop' n = n + (p + 1) * (MAX_N - CLng(10 p) + 2) + MAX_N' s = String$(n, ",")n = MAX_N 2 '要取的个数,取所有的话用MAX_N+1'计算并为s分配足够的大小s = String$(n * Len(CStr(MAX_N + 1), ",") '分配足够大的内存,以后再减p = 0: p

12、s = 1Do Until p >= ni = CLng(Rnd * (MAX_N - p)sTemp = CStr(Ary(i)Mid$(s, ps, Len(sTemp) = sTempps = ps + Len(sTemp) + 1Ary(i) = Ary(MAX_N - p) '如果不想破坏数据,把这里改成2个元素交换,而不是简单赋值p = p + 1 '抛弃数组最后一个元素Loops = Left$(s, ps - 2) '去掉多余的部分t = timeGetTime - tDebug.Print s '输出Debug.Print CStr(t), Len(s)End Sub'= '方法七:(最快)Option ExplicitOption Base 1Private Declare Function timeGetTime Lib "winmm.dll" () As LongConst Nums = 10000Private Sub Command

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号