2011-02-11 184 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,它不漂亮。