lua 生成隨機數總結

lua 5.3文檔中對math.random()的說明

math.random ([m [, n]])

當不帶參數調用時, 返回一個 [0,1) 區間內一致分佈的浮點僞隨機數。 當以兩個整數 m 與 n 調用時, math.random 返回一個 [m, n] 區間 內一致分佈的整數僞隨機數。 (值 m-n 不能是負數,且必須在 Lua 整數的表示範圍內。) 調用 math.random(n) 等價於 math.random(1,n)html

這個函數是對 C 提供的位隨機數函數的封裝。 對其統計屬性不做擔保。    nginx

經過上面的說名,咱們知道 math.random()是僞隨機。dom

若是用原生lua解釋器,須要生成隨機數,咱們一般須要種隨機種子,例如:函數

math.randomseed(os.time())
-- 爲了使隨機種的變化範圍大,還能夠用
math.randomseed(tonumber(tostring(os.time()):reverse():sub(1, 9)))
-- 或者的你的應用在1秒鐘內有不少次請求,還能夠
ngx.update_time() -- 更新nginx時間
math.randomseed(tonumber(tostring(ngx.now()*1000):reverse():sub(1, 9))) -- 毫秒
 

OpenResty用的是luajit解釋器,luajit的擴展中從新實現了math.random()測試

LuaJIT uses a Tausworthe PRNG with period 2^223 to implement math.random() and math.randomseed(). The quality of the PRNG results is much superior compared to the standard Lua implementation which uses the platform-specific ANSI rand(). lua

詳細參考:http://luajit.org/extensions.htmlspa

 

通過測試在使用luajit時,直接使用math.random(),和使用 math.randomseed(tonumber(tostring(ngx.now()*1000):reverse():sub(1, 9))) 都能獲得比較理想的隨機數code

相關文章
相關標籤/搜索