Erlang - 随机数发生器

BAR*_*BAR 4 random erlang integer

我使用以下内容生成一个近似随机数.

3> erlang:ref_to_list(make_ref()).

"#Ref<0.0.0.36>"
Run Code Online (Sandbox Code Playgroud)

我想要的是00036

嗯,这是我之前通知我可以做的事情.在我看来,从make ref中提取数字并不容易.

任何人都可以展示如何轻松完成,或者可能推荐另一种解决方案.

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

问候

I G*_*ERS 21

注意:从OTP 18 erlang:now/0 random 模块不推荐使用,OTP 20将删除该 random 模块.有关详细信息,请参阅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()的返回值可用于生成唯一的时间戳,如果在快速机器上的紧密循环中调用它,则节点的时间可能会变得偏斜.

(强调我的)

另请注意,randomPRNG是按进程进行的,因此您应始终使用播种器调用启动进程:

init([..]) ->
  random:seed(erlang:now()),
  [..]
  {ok, #state { [..] }}.
Run Code Online (Sandbox Code Playgroud)

也许可以使用参考文献,但我不认为它是可行的.解决方案结束了erlang:ref_to_list/1,它并不漂亮.

  • +1"PRNG是每个进程".这实际上是我正在寻找的信息. (2认同)