Random Erlang-随机数生成器

Random Erlang-随机数生成器,random,erlang,integer,Random,Erlang,Integer,我使用下面的公式来生成一个近似随机数 3> erlang:ref_to_list(make_ref()). "#Ref<0.0.0.36>" 3>erlang:ref\u to\u列表(make\u ref())。 “#参考” 我要的是00036 这就是我在以前的帖子中被告知我可以做的。我突然想到,从make ref中提取数字并不那么容易 任何人都可以展示它是如何容易地完成的,或者可能推荐另一种解决方案 请记住,使用random:seed()在相同的几纳秒内调用时不是随机

我使用下面的公式来生成一个近似随机数

3> erlang:ref_to_list(make_ref()).

"#Ref<0.0.0.36>"
3>erlang:ref\u to\u列表(make\u ref())。
“#参考”
我要的是00036

这就是我在以前的帖子中被告知我可以做的。我突然想到,从make ref中提取数字并不那么容易

任何人都可以展示它是如何容易地完成的,或者可能推荐另一种解决方案

请记住,使用random:seed()在相同的几纳秒内调用时不是随机的

关于

注意:从OTP18
erlang:now/0
random
模块不推荐使用,OTP20将删除
random
模块。有关更多详细信息,请参阅。此外,如果使用
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,但并不完美。

不要在每次调用随机数生成器时都对其重新设定种子。播种一次,然后使用它。
random
模块在这方面非常好。您能澄清一下您想要的是随机数还是唯一数吗?它们是非常不同的生物,“make_ref”不会产生随机数。是的,加上你想使用的随机数,是游戏、模拟还是安全。因为为了安全起见,你需要完全不同的随机数。谢谢你关于now()的有趣观点。我给我的应用程序计时,得到1微秒,你说这意味着我的时间可以更快!无论哪种方式,您都可以按照您的方式编写编辑?您仍然没有说明您想要的值是唯一的(没有其他人拥有该值)还是随机的(没有人可以轻松猜测该值)。此外,您还没有说明在何种程度上需要随机性。您可能需要详细说明这些事情,否则人们无法帮助您。+1表示“PRNG是每个流程”。这实际上就是我要寻找的信息。要获得更多随机和安全的种子,您应该使用
crypto:strong\u rand\u bytes/1
。对于OTP 18及更高版本,只需使用
rand:uniform/0
。它不仅使用依赖于时间的值,而且还使用所有其他单调递增的数字生成器来自动播种。请记住,
erlang:now/0
已被弃用。有关更多详细信息,请参阅。