我将以下命令应用于两个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)
您所描述的通常是传统的伪随机数生成器(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范围内的数字,整数关口N
来rand: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)
归档时间: |
|
查看次数: |
915 次 |
最近记录: |