VB生成不重复的随机数.docx

上传人:b****7 文档编号:10008270 上传时间:2023-02-07 格式:DOCX 页数:8 大小:16.54KB
下载 相关 举报
VB生成不重复的随机数.docx_第1页
第1页 / 共8页
VB生成不重复的随机数.docx_第2页
第2页 / 共8页
VB生成不重复的随机数.docx_第3页
第3页 / 共8页
VB生成不重复的随机数.docx_第4页
第4页 / 共8页
VB生成不重复的随机数.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

VB生成不重复的随机数.docx

《VB生成不重复的随机数.docx》由会员分享,可在线阅读,更多相关《VB生成不重复的随机数.docx(8页珍藏版)》请在冰豆网上搜索。

VB生成不重复的随机数.docx

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

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1