原文連結:http://blog.csdn.net/zhangxaochen/article/details/8095007
Lua 產生隨機數需要用到兩個函數:
math.randomseed(xx), math.random([n [, m]])
1. math.randomseed(n) 接收一個整數 n 作為隨機序列種子。
2. math.random([n [, m]]) 有三種用法: 無參調用, 產生 (0,1) 之間的浮點隨機數; 只有參數 n, 產生 1-n 之間的整數; 有兩個參數 n, m, 產生 n-m 之間的隨機整數
對於相同的隨機種子, 產生的隨即序列一定是相同的。所以程式每次運行, 賦予不同的種子很重要。很自然想到使用系統時間作為隨機種子,即:
math.randomseed(os.time())----然後不斷產生隨機數for i=1, 5 do print(math.random())end
但是問題出來了, 如果程式已耗用時間, 你又在很短的時間內多次運行這個程式,那麼你得到的隨機序列會是幾乎不變的。 像這樣:
>lua -e "io.stdout:setvbuf 'no'" "test.lua"
0.71141697439497
0.060121463667714
0.067506942960906
0.8607745597705
0.60652485732597
>Exit code: 0
>lua -e "io.stdout:setvbuf 'no'" "test.lua"
0.71141697439497
0.060121463667714
0.067506942960906
0.8607745597705
0.60652485732597
>Exit code: 0
>lua -e "io.stdout:setvbuf 'no'" "test.lua"
0.7115085299234
0.38813440351573
0.6127201147496
0.59511093478195
0.9212927640614
>Exit code: 0
可以看到前兩次啟動並執行隨機數都是一樣的。究其原因,就是 os.time() 返回的時間是秒級的, 不夠精確, 而 random() 還有個毛病就是如果 seed 很小或者seed 變化很小,產生的隨機序列仍然很相似。比如:
math.randomseed(100)print(math.random(1000))math.randomseed(102)print(math.random(1000))
兩次賦予的 seed 分別是 100, 102 但是random 產生的第一個隨機數卻是一樣的。因此“短時間內多次運行程式” 這樣的需求下 os.time 還真不大好。可是又沒有比 time 函數更方便的種子產生器, 怎麼辦呢?
可以這樣:
math.randomseed(tostring(os.time()):reverse():sub(1, 6))
就是把 time返回的數值字串倒過來(低位變高位), 再取高位6位。 這樣, 即使 time變化很小, 但是因為低位變了高位, 種子數值變化卻很大,就可以使偽隨機序列產生的更好一些
參考文章:http://lua-users.org/wiki/MathLibraryTutorial
數學庫源碼: http://www.lua.org/source/5.1/lmathlib.c.html
原文連結:http://blog.csdn.net/zhangxaochen/article/details/8095007
{{OVER}}