为什么使用相同的种子,Erlang会生成相同的随机数序列?

  • 本文关键字:随机数序列 Erlang 种子 erlang
  • 更新时间 :
  • 英文 :


我将以下命令应用于两个erlang提示符,它们都生成相同的随机数序列,那么这是否意味着它在erlang语言中是伪随机的?我对其原理很好奇,因为在Java中,即使我为它提供两次相同的种子,序列也不会相同。很多谢谢!

random:seed(6, 6, 6).
random:uniform(100).
random:uniform(100).
...
the generated sequence: 12, 27, 79, 58, 90, 25, ...

您所描述的通常是传统伪随机数生成器(prng)的工作方式,包括Erlang的random模块,我认为它实现了Wichman-Hill,但今天的prng必然更复杂。在Erlang 18中,您将发现一个新的rand模块,它不会遇到您所描述的问题。

从下面复制的shell会话中可以看到,您可以在不同的进程中调用rand:uniform/0,1函数而不需要播种,并且各个进程中的初始数字将不同:

1> rand:uniform().
0.10584199892675317
2> Self = self().
<0.1573.0>
3> f(R), spawn(fun() -> Self ! rand:uniform() end), receive R -> R end.
0.9124422823012622
4> f(R), spawn(fun() -> Self ! rand:uniform() end), receive R -> R end.
0.9476479571869831
5> f(R), spawn(fun() -> Self ! rand:uniform() end), receive R -> R end.
0.037189460750910064
6> f(R), spawn(fun() -> Self ! rand:uniform() end), receive R -> R end.
0.17698653918897836

第一个调用直接在shell进程中运行。然后我们获得shell的pid,将其存储到Self中,并连续生成四个进程,每个进程将rand:uniform/0的结果发送回shell, shell将其接收到R中。如您所见,四个生成的进程各自返回不同的值,所有这些值都不同于shell第一次运行rand:uniform/0时得到的值。

如果你想要一个数字在0-1以外的范围内,传递一个整数Nrand:uniform/1,你会得到一个值V在范围1 <= V <= N:

7> f(R), spawn(fun() -> Self ! rand:uniform(1234567) end), receive R -> R end.
510226
8> f(R), spawn(fun() -> Self ! rand:uniform(1234567) end), receive R -> R end.
562646
9> f(R), spawn(fun() -> Self ! rand:uniform(1234567) end), receive R -> R end.
250637
10> f(R), spawn(fun() -> Self ! rand:uniform(1234567) end), receive R -> R end.
820871
11> f(R), spawn(fun() -> Self ! rand:uniform(1234567) end), receive R -> R end.
121252

最新更新