lua如何產生隨機數,以及需要注意的問題

        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)就可以了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章