版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、VB 生成不重復(fù)的隨機(jī)數(shù)VB生成不重復(fù)的隨機(jī)數(shù)我的建議是:第一步、先做一個(gè)數(shù)組,存上這 35 個(gè)數(shù)(可以不是連續(xù)的數(shù),也 可以是人名、字符串什么的) ;第二步、隨機(jī)生成一個(gè) 1-35之間的數(shù),輸出;第 三步:把這個(gè)數(shù)和數(shù)組的第一個(gè)單元交換;第四步、從數(shù)組的第 2-35 之間隨機(jī) 抽取第二個(gè)數(shù), 輸出;第五步、把這隨機(jī)抽取的第二個(gè)數(shù)和數(shù)組的第二個(gè)單元內(nèi) 容呼喚;第六步、隨機(jī)抽取第三個(gè)數(shù),輸出。 。重復(fù)到從第 35-35 個(gè)數(shù)之間隨 機(jī)抽取一個(gè)數(shù),這時(shí)直接輸出最后一個(gè)就行了。程序如下( VB6):工程里默認(rèn)的窗體上,畫一個(gè) Commandl,粘貼程序:option explicitprivate
2、vArray(1 to 35) as currency '定; 義數(shù)組個(gè)數(shù)private sub command1_click()testend subprivate sub InitArray()dim i as long'給數(shù)組賦值 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 stringInitArray randomize timer&a
3、mp;#39;設(shè)置隨機(jī)因子,使其每次運(yùn)行程序的隨機(jī)數(shù)都不一樣iStart=1 do iPos=int(rnd*(ubound(vArray)-iStart+1)+iStart '產(chǎn)生 iStart 到 35(35取自 vArray 的上標(biāo))之間的整數(shù)sReturn=sReturn & vArray(iPos) & vbcrlf '輸; 出 '交換單元內(nèi)容vTemp=vArray(iStart) vArray(iStart)=vArray(iPos) vArray(iPos)=vTempiStart=iStart+1
4、'下次隨機(jī)生成時(shí),少生成一個(gè)if iStart>=ubound(vArray) then '最后一個(gè)了,直接輸出sReturn=sReturn & vArray(ubound(vArray)Exit Doend ifif iStart>7 then exit do ' 如果需要生成幾個(gè)數(shù), 就把 7 改成幾, 大于數(shù)組元 素的個(gè)數(shù),將輸出速度的元素個(gè)數(shù) (這個(gè)例子是 35)Loopmsgbox sRetur n 'msgbox 輸出結(jié)果end sub'='
5、方法二Private Sub Command1_Click()Dim a(35) As IntegerFor i = 0 To 35way1:Randomizea(i) = Int(Rnd() * 36) + 1If i > 1 ThenFor p = 0 To i - 1If a(p) = a(i) Then ' 與前面的對(duì)比,如果有重復(fù),重新隨機(jī)GoTo way1End IfNext p3End IfPrint a(i);'打印Next iPrint ""'打印End Sub'
6、='方法三如果樓主是要產(chǎn)生 0-9 等 10 個(gè)不重復(fù)的隨機(jī)數(shù)的話,在隨機(jī)數(shù)范圍和個(gè)數(shù)相等 的情況下, 樓上的方法都無(wú)異于散彈打鳥(niǎo)。 在最不利情況下時(shí)間將無(wú)限延長(zhǎng), 特 別是對(duì)更多隨機(jī)數(shù)的時(shí)候。以下提供兩種思路:1.實(shí)際上我們只要確定了其中 9個(gè)數(shù)字那么第 10 個(gè)數(shù)字根本不用去想;確定 8 個(gè),那么隨機(jī)只在 2 個(gè)數(shù)之間,以此類推,使用 動(dòng)態(tài)數(shù)組如a(),先用for將10個(gè)數(shù)字加入,然后開(kāi)始rnd*ubound(a)取得其中一 個(gè),放入數(shù)組b,再將該數(shù)字從a數(shù)組中剔除。速度:(n+nA2)/22.只需要得到 10 個(gè)無(wú)序排列的數(shù)字即可,沒(méi)必要去一直產(chǎn)生隨機(jī)數(shù),只要打亂 順序即
7、可。在數(shù)組 a 中加入 10 個(gè)數(shù)字,然后開(kāi)始 for 循環(huán) 10 次,每次產(chǎn)生一個(gè) 10 以內(nèi)的隨機(jī)數(shù),然后將循環(huán)次數(shù) i 與隨機(jī)數(shù)的位置互換。速度: n'方法四關(guān)于隨機(jī)數(shù)的不重復(fù)求取Option Base 1Private Sub Command1_Click()Randomize TimerDim A(1 To 10) As Integer '數(shù)組 MDim B(1 To 8) As String'數(shù)組 NDim i As Integer, k As Integer, t As IntegerFor i = 1 To 10A(i) = iN
8、extFor i = 1 To 10' 數(shù)組打亂t = A(i)k = Fix(Rnd * 10) + 1A(i) = A(k)A(k) = tNextFor i = 1 To 8 '從; M 中隨機(jī)取出 N 個(gè)數(shù) ,不重復(fù)B(i) = A(i)NextLabel1.Caption = Join(B(), " , ")End Sub'方法五= Private Sub Command2_Click()Randomize TimerDim Dimension(8)Dim i As Byte, j As ByteRan
9、domize 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(Dimension(), " , ")End SubPrivate Sub Command3_Click()EndEnd Sub
10、9;= '方法六:(最快)還有種方法是隨機(jī)取數(shù)組中一個(gè)數(shù) ,取出后將該元素與數(shù)組最后一個(gè)元素交換 ,然 后隨機(jī)上限減一然后就是字符串的速度了一次分配足夠大的字符串,而不是用&連接字符 串會(huì)快很多Option ExplicitPrivate Declare Function timeGetTime Lib "winmm.dll" () As LongPrivate Const MAX_N = 10000 - 1 在 1(MAX_N+1的數(shù)字中取Private Sub Command1_Click()Dim Ary(
11、MAX_N) As LongDim i&, n&, p&, t&, ps&Dim s$, sTemp$ t = timeGetTime'初始化For i = 0 To MAX_NAry(i) = i + 1NextRandomize''計(jì)算并為s分配足夠的大小,下面是當(dāng)n=MAX_N+1時(shí)最終的s的長(zhǎng)度的精確值'i = MAX_N + 1: p = 0: ps = 9'Do Until i <= 9'p =
12、 p + 1'n = n + ps * p'ps = ps * 10'i = i 10'Loop'n = n + (p + 1) * (MAX_N - CLn g(10 A p) + 2) + MAX_N's = String$(n, ",")n = MAX_N 2 '要取的個(gè)數(shù) ,取所有的話用 MAX_N+1'計(jì)算并為 s 分配足夠的大小1), ",") '分String$(n
13、* Len(CStr(MAX_N + 配足夠大的內(nèi)存 ,以后再減 p = 0: ps = 1Do Until p >= n i = CLng(Rnd * (MAX_N - p) sTemp = CStr(Ary(i)Mid$(s, ps, Len(sTemp) = sTemp ps = ps + Len(sTemp) + 1Ary(i) = Ary(MAX_N - p) '如; 果不想破壞數(shù)據(jù) ,把這里改成 2個(gè)元素交換 ,而不是 簡(jiǎn)單賦值p = p + 1 '拋棄數(shù)組最后一個(gè)元素Loops = Left$(s, ps - 2) '去;
14、 掉多余的部分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 Command1_Click()Dim t As LongDim Num(Nums) As LongDim i, n As LongDi
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度職工住房借款與社區(qū)養(yǎng)老配套服務(wù)協(xié)議3篇
- 二零二五年度吊裝工程安全評(píng)估與監(jiān)督管理合同2篇
- 2025年辦公家具回收利用與環(huán)保處理合同3篇
- 極簡(jiǎn)市場(chǎng)營(yíng)銷(杰瑞20231224)
- 二零二五年度花椒采摘與旅游融合發(fā)展合同3篇
- 2024年陽(yáng)泉煤業(yè)(集團(tuán))有限責(zé)任公司總醫(yī)院三礦醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 2024年河南水利與環(huán)境職業(yè)學(xué)院高職單招數(shù)學(xué)歷年參考題庫(kù)含答案解析
- 2024年河北機(jī)電職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試歷年參考題庫(kù)含答案解析
- 二零二五年度美食街?jǐn)偽蛔赓U及廣告投放合同3篇
- 2024年江蘇財(cái)經(jīng)職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試歷年參考題庫(kù)含答案解析
- 中醫(yī)五臟心完整版本
- 聚合工藝作業(yè)安全培訓(xùn)課件
- 智能音箱方案
- 2022年7月25日多?。ㄊ?、區(qū))公務(wù)員聯(lián)考《公安基礎(chǔ)知識(shí)》(專業(yè)科目)試卷(網(wǎng)友回憶版)
- 2024年廣東省職業(yè)院校技能大賽中職組《導(dǎo)游服務(wù)》賽項(xiàng)備考試題庫(kù)(含答案)
- 手推車檢測(cè)技術(shù)規(guī)范
- 京東商城物流配送現(xiàn)狀及對(duì)策分析
- 個(gè)人極端事件防范應(yīng)急預(yù)案
- JJF 1521-2023燃油加油機(jī)型式評(píng)價(jià)大綱(試行)
- 英語(yǔ)八年級(jí)英語(yǔ)上冊(cè)閱讀理解100及答案經(jīng)典
- 兒科佝僂病中醫(yī)診療規(guī)范診療指南2023版
評(píng)論
0/150
提交評(píng)論