Lua 隨機數生成問題

2021-06-10 09:34:46 字數 1719 閱讀 4708

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...