我正在使用以下來生成一個近似的隨機數。Erlang - 隨機數發生器
3> erlang:ref_to_list(make_ref()).
"#Ref<0.0.0.36>"
我要的是00036
那麼它是什麼,我已被告知,我可以在一前一後做。我想到從製作參考文獻中提取數字並不那麼容易。
任何人都可以展示它是如何輕鬆完成的,或者可能推薦其他解決方案。
請記住,使用隨機:在相同的幾納秒內調用seed()不是隨機的。
問候
我正在使用以下來生成一個近似的隨機數。Erlang - 隨機數發生器
3> erlang:ref_to_list(make_ref()).
"#Ref<0.0.0.36>"
我要的是00036
那麼它是什麼,我已被告知,我可以在一前一後做。我想到從製作參考文獻中提取數字並不那麼容易。
任何人都可以展示它是如何輕鬆完成的,或者可能推薦其他解決方案。
請記住,使用隨機:在相同的幾納秒內調用seed()不是隨機的。
問候
注:從OTP 18erlang:now/0
和random
模塊已被棄用,和OTP 20將刪除random
模塊。查看Time and Time Correction in Erlang瞭解更多詳情。另外,如果您使用rand:uniform/0
,則不再需要執行按流程播種。以下內容僅供參考。
問題是您錯誤地使用了random
。 random: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
,它不漂亮。
每次調用時都不要重新生成隨機數生成器。種子一次然後使用它。 「隨機」模塊對此非常好。 – nmichaels 2011-02-11 21:59:29
你可以澄清,如果你想要隨機數或唯一的數字?他們是非常不同的生物,並且_no way_中的'make_ref'會產生隨機數。 – archaelus 2011-02-11 23:55:51