我使用以下内容生成一个近似随机数。
3> erlang:ref_to_list(make_ref()).
"#Ref<0.0.0.36>"
我想要的是00036
嗯,这是我在前一篇文章中被告知的事情。在我看来,从make ref中提取数字并不容易。
任何人都可以展示如何轻松完成,或者可能推荐其他解决方案。
请记住,在相同的几纳秒内调用时,使用random:seed()不是随机的。
此致
答案 0 :(得分:21)
注意:来自OTP 18 erlang:now/0
和 random
模块已弃用,OTP 20将删除 random
模块。有关详细信息,请参阅Time and Time Correction in Erlang。此外,如果使用rand:uniform/0
,则不再需要执行每进程种子设定。以下内容仅供参考。
问题是您错误地使用了random
。 random:seed/0
将始终使用相同的种子为随机数生成器播种。这对你想要的东西不好。相反,您可以使用random:seed(erlang:now())
将其与另一个数字(即当前时间)一起播种。
“如果两个电话非常接近,会发生什么?”你可能会问。好吧,Erlang的人想到了这一点,所以now/0
保证总是会返回越来越多的数字:
返回元组{MegaSecs,Secs,MicroSecs} 格林威治标准时间1970年1月1日00:00(零小时)起经过的时间 假设底层操作系统支持这一点。否则,一些 选择其他时间点。 也保证了 对此BIF的进行调用会不断增加值。 因此,now()的返回值可用于生成 独特的时间戳,如果在一个紧密循环中调用它 快速机器节点的时间会变得歪斜。
(强调我的)
另请注意,random
PRNG是按流程进行的,因此您应始终使用播种机电话启动您的流程:
init([..]) ->
random:seed(erlang:now()),
[..]
{ok, #state { [..] }}.
也许可以使用参考文献,但我不认为它是可行的。解决方案超过了erlang:ref_to_list/1
并且它并不漂亮。