LUA中的自帶函數庫中有兩個關於隨機數的函數,一個是random,一個是randomseed。
random有兩個參數,用來設置隨機數的範圍,比如random(1,100)設置隨機數的範圍爲1至100之間。
(random函數說明)This function is an interface to the simple pseudo-random generator function rand
provided by ANSI C.
由於C中所產生的隨機序列是固定的。也就是每次執行時取得的隨機數是一樣的。LUA的random函數說明已經指出,lua的random函數只是對ansi c的隨機函數的一次封裝。所以依然存在這個問題。執行random(1,600),每次的輸出結果都是:
[LUA-print] 1
[LUA-print] 79
[LUA-print] 454
[LUA-print] 276
[LUA-print] 320
[LUA-print] 132
[LUA-print] 29
[LUA-print] 408
[LUA-print] 408
[LUA-print] 561
這個只是僞隨機,並不能達到我們想要的效果,於是另一個函數的用處就有了。
randomseed()函數,設置隨機數的種子。在lua虛擬機啓動的時候設置一個隨機種子,讓系統產生的隨機序列不相同,但使用randomseed的時候也還要注意一個問題,那就是做種子的數要足夠的大,大於10000就行了。不然randomseed所產生的隨機序列的第一個值還是很小。原因是randomseed是直接封裝了C的srand,如果種子的值太小,那麼srand所產生的序列和默認序列(srand(1)所產生的序列)是相差不大的,序列的第一個值還是很小。
因此,只要在lua虛擬機啓動的時候調用一下randomseed(os.time())就可以解決這個問題了。但是這樣依然還有問題存在。
雖然可以獲取我們想要的真正的隨機數了,但是有個缺陷就是每次第一次調用時獲取的隨機數依然就固定的,至於原因就涉及到lua內部實現了。解決方法很簡單,就是在設置隨機種子的時候調用一下random函數,隨後就能正常獲取隨機數了。
在lua虛擬機啓動的時候調用:
--設置隨機種子
math.randomseed(os.time())
math.random(1,10000)
需要隨機數的時候只需要調用:random(1,600)就可以了。