我正在使用以下来生成一个近似的随机数。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