VB生成不重复的随机数.docx
- 文档编号:10008270
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:8
- 大小:16.54KB
VB生成不重复的随机数.docx
《VB生成不重复的随机数.docx》由会员分享,可在线阅读,更多相关《VB生成不重复的随机数.docx(8页珍藏版)》请在冰豆网上搜索。
VB生成不重复的随机数
VB生成不重复的随机数
VB生成不重复的随机数
我的建议是:
第一步、先做一个数组,存上这35个数(可以不是连续的数,也可以是人名、字符串什么的);第二步、随机生成一个1-35之间的数,输出;第三步:
把这个数和数组的第一个单元交换;第四步、从数组的第2-35之间随机抽取第二个数,输出;第五步、把这随机抽取的第二个数和数组的第二个单元内容呼唤;第六步、随机抽取第三个数,输出。
。
。
。
。
重复到从第35-35个数之间随机抽取一个数,这时直接输出最后一个就行了。
程序如下(VB6):
工程里默认的窗体上,画一个Command1,粘贴程序:
optionexplicit
privatevArray(1to35)ascurrency'定义数组个数
privatesubcommand1_click()
test
endsub
privatesubInitArray()
dimiaslong
'给数组赋值
fori=1to35
varray(i)=i
nexti
endsub
privatesubTest()
dimiStartaslong
dimiPosaslong
dimvTempascurrency
dimsReturnasstring
InitArray
randomizetimer'设置随机因子,使其每次运行程序的随机数都不一样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'下次随机生成时,少生成一个
ifiStart>=ubound(vArray)then
'最后一个了,直接输出
sReturn=sReturn&vArray(ubound(vArray))
ExitDo
endif
ifiStart>7thenexitdo'如果需要生成几个数,就把7改成几,大于数组元素的个数,将输出速度的元素个数(这个例子是35)
Loop
msgboxsReturn'msgbox输出结果
endsub
'==============================================================================================
'方法二
PrivateSubCommand1_Click()
Dima(35)AsInteger
Fori=0To35
way1:
Randomize
a(i)=Int(Rnd()*36)+1
Ifi>1Then
Forp=0Toi-1
Ifa(p)=a(i)Then'‘与前面的对比,如果有重复,重新随机
GoToway1
EndIf
Nextp
EndIf
Printa(i);'打印
Nexti
Print""'打印
EndSub
'==========================================================================================
'方法三
如果楼主是要产生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
'================================================================================================
'方法四
关于随机数的不重复求取
OptionBase1
PrivateSubCommand1_Click()
RandomizeTimer
DimA(1To10)AsInteger'数组M
DimB(1To8)AsString'数组N
DimiAsInteger,kAsInteger,tAsInteger
Fori=1To10
A(i)=i
Next
Fori=1To10'数组打乱
t=A(i)
k=Fix(Rnd*10)+1
A(i)=A(k)
A(k)=t
Next
Fori=1To8'从M中随机取出N个数,不重复
B(i)=A(i)
Next
Label1.Caption=Join(B(),",")
EndSub
'方法五======================================================PrivateSubCommand2_Click()
RandomizeTimer
DimDimension(8)
DimiAsByte,jAsByte
RandomizeTimer
Fori=1To8
Dimension(i)=Fix(Rnd*10)+1
Nexti
A:
Fori=1To7
Forj=i+1To8
IfDimension(i)=Dimension(j)Then
Dimension(i)=Fix(Rnd*10)+1
GoToA
EndIf
Nextj
Nexti
Label1.Caption=Join(Dimension(),",")
EndSub
PrivateSubCommand3_Click()
End
EndSub
'==============================================================='方法六:
(最快)
还有种方法是随机取数组中一个数,取出后将该元素与数组最后一个元素交换,然后随机上限减一
然后就是字符串的速度了...一次分配足够大的字符串,而不是用&连接字符串会快很多
OptionExplicit
PrivateDeclareFunctiontimeGetTimeLib"winmm.dll"()AsLong
PrivateConstMAX_N=10000-1'在1~(MAX_N+1)的数字中取
PrivateSubCommand1_Click()
DimAry(MAX_N)AsLong
Dimi&,n&,p&,t&,ps&
Dims$,sTemp$
t=timeGetTime
'初始化
Fori=0ToMAX_N
Ary(i)=i+1
Next
Randomize
''计算并为s分配足够的大小,下面是当n=MAX_N+1时最终的s的长度的精确值
'i=MAX_N+1:
p=0:
ps=9
'DoUntili<=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:
ps=1
DoUntilp>=n
i=CLng(Rnd*(MAX_N-p))
sTemp=CStr(Ary(i))
Mid$(s,ps,Len(sTemp))=sTemp
ps=ps+Len(sTemp)+1
Ary(i)=Ary(MAX_N-p)'如果不想破坏数据,把这里改成2个元素交换,而不是简单赋值
p=p+1'抛弃数组最后一个元素
Loop
s=Left$(s,ps-2)'去掉多余的部分
t=timeGetTime-t
Debug.Prints'输出
Debug.PrintCStr(t),Len(s)
EndSub
'==============================================================='方法七:
(最快)
OptionExplicit
OptionBase1
PrivateDeclareFunctiontimeGetTimeLib"winmm.dll"()AsLongConstNums=10000
PrivateSubCommand1_Click()
DimtAsLong
DimNum(Nums)AsLong
Dimi,nAsLong
DimsAsString
t=timeGetTime
Randomize
Fori=1ToNums
n=Int(Rnd*Nums)+1
IfNum(n)=0Then
Num(n)=n
s=s&n&","Else
i=i-1
EndIf
Nexti
Text1.Text=s
t=timeGetTime-t
MsgBoxt
EndSub
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VB 生成 重复 随机数