最近幾天想用vba寫一個背單詞的小工具,用來常常考考本身,要在單詞本中隨機的抽出必定數量的單詞來,第一次沒有發現什麼問題,但是但我第二次第三次打開這個工具的時候,問題出現了,就是每次都是「隨機」產生那麼幾個單詞,失敗!
翻了翻之前的書,結合網絡上的一些帖子,總結一下緣由,知識就是靠點滴積累的嘛!
一、首先計算機是一個肯定性的系統,不可以產生真正的隨機數,因此程序當中給出的隨機函數,所產生的隨機數都是經過底層計算獲得的,而這些計算須要一個叫作「種子」的數。
二、這個「種子」做爲隨機函數的初期值,計算出第一個「隨機」數來,而後以獲得的第一個「隨機」數爲種子在進行計算獲得下一個「隨機」數來,以此類推。
三、這樣,若是程序每次啓動運行,做爲隨機函數的初期值的那個種子是肯定不變的,那麼獲得的第一個「隨機」數也就是肯定的,進而以後生成的「隨機」數,也是肯定的,這樣就和尚以此程序運行產生的隨機數序列同樣了,當讓也就無「隨機」可言了。呵呵!這也是我沒隨機檢索到單詞的緣由。
四、由於不可以產生真正的隨機數,因此只可以儘量的讓產生的數字,重複的機率下降,起碼讓它長生的數字看起來足夠「隨機」,辦法就是讓種子不斷的變化,根據變化的「種子」計算出來的數字,固然也是變化的。
五、解決方案:就是在每次運行隨機函數以前,都要給隨機函數一個新的種子,如今比較經常使用的作法就是利用系統時間,由於時間是永遠都不相同的,這樣就可以保證每次都給隨機函數一個新種子,進而產生的數字,就應該可以達到隨機的要求了。
在VBA當中的實現:
Private Sub CommandButton1_Click()
Dim j, k As Double
Randomize
For k = 1 To 10
j = Rnd() * 100 + 1
ThisWorkbook.Sheets(1).Cells(k, 1).Value = CStr( j )
Next k
MsgBox "OK!"
End Sub
其中Randomize[number]語句的做用初始化隨機函數Rnd(),目的就是讓Rnd()每次有一個新的種子值,若是沒有number,則用系統計時器返回的值做爲新的種子值。
注意:若是想獲得重複的隨機數序列,直接調用Rnd( )函數就好,使用具備一樣number 值的 Randomize 是不會獲得重複的隨機數序列的。
語言都是相同的,其餘語言也都有相相似的語句。
記在這裏,點滴積累。