按鍵精靈指令碼開發教程:隨機數寫法?

小編今天要分享三種隨機數不重複的方法 ~快來圍觀~

工具/原料

按鍵精靈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 重新隨機。點評:★★★★ 在速度上比常規法快很多。且比陣列法好理解。

教程, 寫法, 指令碼, 按鍵精靈, 隨機數,
相關問題答案