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

Jud*_*ing 3 erlang

我将以下命令应用于两个erlang提示,它们都生成相同的随机数序列,所以它是否意味着它在Erlang语言中是伪随机的?我对基本原理感到好奇,因为在Java中,即使我为它提供相同的种子两次,序列也不会相同.非常感谢!

random:seed(6, 6, 6).
random:uniform(100).
random:uniform(100).
...

the generated sequence: 12, 27, 79, 58, 90, 25, ...
Run Code Online (Sandbox Code Playgroud)

Ste*_*ski 6

您所描述的通常是传统的伪随机数生成器(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
Run Code Online (Sandbox Code Playgroud)

第一个调用直接在shell进程中运行.然后我们获取shell的pid,将其存储Self,并连续生成四个进程,每个进程将结果发送rand:uniform/0回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
Run Code Online (Sandbox Code Playgroud)