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變化很小, 但是因為低位變了高位, 種子數值變化卻很大,就可以使偽隨機序列生成的更好一些
參考文章:
數學庫原始碼:
}
Lua 隨機數生成問題
lua 生成隨機數需要用到兩個函式 math.randomseed xx math.random n m 1.math.randomseed n 接收乙個整數 n 作為隨機序列種子。2.math.random n m 有三種用法 無參呼叫,產生 0,1 之間的浮點隨機數 只有引數 n,產生 1 n ...
Lua 隨機數生成問題
2014 08 27 icecity00.摘自 csdn部落格 閱 131 轉 1 轉藏到我的圖書館 分享 lua 生成隨機數需要用到兩個函式 math.randomseed xx math.random n m 1.math.randomseed n 接收乙個整數 n 作為隨機序列種子。2.mat...
隨機數生成問題
給定隨機生成整數1到5的函式,寫出能隨機生成整數1到7的函式 方法1 rand5 5 rand5 得到 6,30 區間內25個數等概率分布 可以只用6 26之間的21個數,對映到1 7這7個數 27 30怎麼辦?拋棄掉 int rand7 這樣生成的1 7概率均勻,只是其和不等於1 方法2 用ran...