小編今天要分享三種隨機數不重複的方法 ~快來圍觀~
工具/原料
按鍵精靈2014
方法/步驟
常規方法
將隨機到的數字放到數組裡,然後每次隨機產生的數字都和數組裡已有的數字進行比較,如果有重複的則重新生成。
程式碼:(生成10個範圍在10以內的隨機數)
Dim TmpDat(10)
For i = 0 To 9
Randomize
TmpRnd = Int(rnd * 10)
For j = 0 To i - 1
If TmpDat(j)=TmpRnd Then
i = i - 1 : TmpBol = TRUE
End If
Next
If TmpBol Then TmpBol = False Else TmpDat(i) = TmpRnd : TracePrint TmpRnd
Next
分析:
1、Dim TmpDat(10) //例如,需要產生10個不重複的數字,則定義陣列,陣列元素個數為10
2、For i = 0 To 9//由於陣列的最小下標是從0開始的,所以迴圈從0開始到9,迴圈10次
3、Randomize //隨機函式初始化
4、TmpRnd = Int(rnd * 10) //我們生成0-10範圍內的數字,便於檢視效果
5、For j = 0 To i - 1 //再做一次迴圈,將當前生成的隨機數與前面生成的隨機數一 一進行比較。例如:i=5,說明之前已經執行過5次,陣列TmpDat裡已經有了5個元素,它們的下標從0-4 。當我們想要檢視當前隨機到的數字有沒有重複,就需要和前面的產生的隨機數進行比較。所以從0迴圈到i-1 ( i 自身就不需要和自身比了,所以這裡需要減1,排除自身)。
6、If TmpDat(j)=TmpRnd Then//如果生成的隨機數在數組裡已經存在 i = i - 1 : TmpBol = TRUE//則i的值減去1,並且做一個標記,tmpbol設定為true End If
7、If TmpBol Then TmpBol = False Else TmpDat(i) = TmpRnd : TracePrint TmpRnd //如果TmpBol 是真的,說明隨機數字重複了,不做賦值判斷,將tmpbol的賦值假。 如果TmpBol 不是真的,說明隨機數字沒有重複,將新產生的隨機數賦值給陣列,並且輸出。
輸出:
點評:★★ 方法是好的,但是效率上有所欠佳。每次生成一次隨機數都需要和已有資料一一比較,比較耗費時間
陣列法
前面的常規法,只定義了一個數組用來存放隨機數。而陣列法,要定義兩個陣列。一個數組用來存放隨機數,你需要生成多少個隨機數則定義多大範圍的陣列。另一個數組是用來判斷隨機數之前是否產生過,你要生成多大範圍的隨機數,則定義多大的陣列範圍。
程式碼:(生成10個範圍在1000內的隨機數)
Dim TmpDat(10)
Dim TmpArr(1000)//生成的隨機數大小範圍在0~1000
For i = 0 To 9
Randomize
TmpRnd = Int(rnd * 1000)
If TmpArr(TmpRnd) Then
i = i - 1 : TmpBol = TRUE
Else
TmpArr(TmpRnd) = True
End If
If TmpBol Then TmpBol = False Else TmpDat(i) = TmpRnd : TracePrint TmpRnd
Next
要點分析:
1、 TmpRnd = Int(rnd * 1000) //生成隨機數賦值給TmpRnd2、 If TmpArr(TmpRnd) Then //例如,隨機到的數字是10, TmpArr(10),因為我們並沒有給TmpArr數組裡的任何元素賦值過。
TmpArr(10)為空,那麼,當它作為判斷條件的時候,會被轉換為布林值進行判斷, cbool(TmpArr(10))=0, 0表示假,所以條件不成立,執行else後面的語句: TmpArr(TmpRnd) = True //將 TmpArr(10) 賦值真,當第二次再隨機到數字10的時候, If 條件成立,條件成立則忽略當前隨機到的數字 i-1 重新隨機。
點評:★★★ 在速度上比常規法快很多。
字串查詢法
字串查詢法:
定義一個數組用來存放產生的不重複隨機數。
定義一個字串變數,用來存放已經生成的隨機數,每次隨機數產生後都和字串做比較,如果隨機數在字串裡存在,則 i-1 重新隨機。
程式碼:(生成10個範圍在10以內的隨機數)
Dim TmpDat(10)
For i = 0 To 9
Randomize
TmpRnd = Int(rnd * 10)
If InStr(TmpStr, TmpRnd & " ") Then
i = i - 1 : TmpBol = TRUE
Else
TmpStr = TmpStr&TmpRnd & " "
End If
If TmpBol Then TmpBol = False Else TmpDat(i) = TmpRnd : TracePrint TmpRnd
Next
InStr 函式的語法:InStr([start, ]string1, string2[, compare])引數:
分析:
If InStr(TmpStr, TmpRnd & " ") Then //例如,隨機到的數字為10。 第一次執行判斷,TmpStr是空的。InStr(TmpStr, TmpRnd & " ") 在Tmpstr裡找不到 “10 ”,返回值為0,0表示假,則執行else後面的語句: TmpStr = TmpStr & TmpRnd & " " 將隨機到的數放到TmpStr裡。 當第二次再隨機到數字10的時候, If 條件成立,條件成立則忽略當前隨機到的數字 i-1 重新隨機。點評:★★★★ 在速度上比常規法快很多。且比陣列法好理解。