2011-02-11 237 views
4

我正在使用以下來生成一個近似的隨機數。Erlang - 隨機數發生器

3> erlang:ref_to_list(make_ref()). 

"#Ref<0.0.0.36>" 

我要的是00036

那麼它是什麼,我已被告知,我可以在一前一後做。我想到從製作參考文獻中提取數字並不那麼容易。

任何人都可以展示它是如何輕鬆完成的,或者可能推薦其他解決方案。

請記住,使用隨機:在相同的幾納秒內調用seed()不是隨機的。

問候

+2

每次調用時都不要重新生成隨機數生成器。種子一次然後使用它。 「隨機」模塊對此非常好。 – nmichaels 2011-02-11 21:59:29

+0

你可以澄清,如果你想要隨機數或唯一的數字?他們是非常不同的生物,並且_no way_中的'make_ref'會產生隨機數。 – archaelus 2011-02-11 23:55:51

回答

21

注:從OTP 18erlang:now/0random模塊已被棄用,和OTP 20將刪除random模塊。查看Time and Time Correction in Erlang瞭解更多詳情。另外,如果您使用rand:uniform/0,則不再需要執行按流程播種。以下內容僅供參考。


問題是您錯誤地使用了randomrandom:seed/0將隨機數種子發生器與種子總是一樣種子。這對你想要的東西不好。相反,您可以使用random:seed(erlang:now())將其與另一個數字(即當前時間)一起播種。 「

」如果兩個電話打得很近,會發生什麼?「你可能會問。好了,二郎神人想過這一點,所以now/0是保證總是返回越來越多:

返回元組{MegaSecs,秒,微秒}這是 經過時間自00:00 GMT,1月1日, 1970年(零小時) 假設底層操作系統支持此操作。否則,選擇一些其他時間點。 也保證,調用此BIF的子呼叫不斷增加的值返回 。 因此,now()的返回值可用於生成 唯一時間戳,並且如果在快速機器上以緊密循環方式調用該節點,節點的時間可能會出現偏差。

(重點煤礦)

還要注意的是random PRNG是每個進程,所以你應該總是用播種機呼叫啓動過程了:

init([..]) -> 
    random:seed(erlang:now()), 
    [..] 
    {ok, #state { [..] }}. 

使用引用因爲這也許是可能的,但我不認爲這是可行的。該解決方案通過erlang:ref_to_list/1,它不漂亮。