Ada*_*erg 24
要生成一个1000个元素的列表,其中包含1到10之间的随机数:
[rand:uniform(10) || _ <- lists:seq(1, 1000)].
Run Code Online (Sandbox Code Playgroud)
将10和1000更改为适当的数字.如果省略rand:uniform调用中的10 ,则会得到介于0.0和1.0之间的随机浮点数.
在18.0以下的Erlang版本上:改用random模块.警告!您需要random:seed/3在每个进程使用它之前运行,以避免获得相同的伪随机数.
Til*_*man 13
确保适当播种.
> F = fun() -> io:format("~p~n", [[random:uniform(10) || _ <- lists:seq(1, 10)]]) end.
> spawn(F).
[1,5,8,10,6,4,6,10,7,5]
> spawn(F).
[1,5,8,10,6,4,6,10,7,5]
Run Code Online (Sandbox Code Playgroud)
你的直觉是结果会有所不同.Erlang中的随机种子是特定于进程的.但是默认种子是固定的.这就是为什么你得到相同的结果,即使示例中有两个进程.
> G = fun() -> {A1,A2,A3} = now(),
random:seed(A1, A2, A3),
io:format("~p~n", [[random:uniform(10) || _ <- lists:seq(1, 10)]])
end.
> spawn(G).
[3,1,10,7,9,4,9,2,8,3]
> spawn(G).
[9,1,4,7,8,8,8,3,5,6]
Run Code Online (Sandbox Code Playgroud)
请注意,如果返回值now()在两个不同的进程中相同,则最终会出现与上述相同的问题.这就是为什么有些人喜欢使用gen_server包装随机数生成的原因.或者你可以使用更好的种子.