如何在Erlang中创建1000个随机数的列表?

USe*_*299 13 erlang erlang-shell

我确信它有一个功能.我只想列出1000个数字,每个数字应该是随机的.

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在每个进程使用它之前运行,以避免获得相同的伪随机数.

  • 随机做一个好主意:seed(now()).在那之前 (4认同)

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包装随机数生成的原因.或者你可以使用更好的种子.

  • 但是,`now()`保证永远不会在同一节点中两次给出相同的结果. (4认同)
  • `crypto`模块中还有其他更强大的随机数生成器(参见[http://www.erlang.org/doc/man/crypto.html](http://www.erlang.org/doc/man/crypto)的.html)) (4认同)