【Lua】使用隨機數

來源:互聯網
上載者:User

標籤:io   os   使用   ar   for   sp   div   問題   時間   

遊戲中建立角色有個隨機取名功能,用到了隨機數,網上找了篇在lua中使用隨機數的文章,mark一下。

 

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】使用隨機數(轉)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.