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

时间:2012-04-25 14:48:28

标签: erlang erlang-shell

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

6 个答案:

答案 0 :(得分:22)

要生成1000个元素的列表,其中随机数介于1和10之间:

[rand:uniform(10) || _ <- lists:seq(1, 1000)].

将10和1000更改为适当的数字。如果省略rand:uniform调用中的10,则会得到介于0.0和1.0之间的随机浮点数。

在18.0以下的Erlang版本上:改为使用random模块。 警告!在每个进程使用它之前,您需要运行random:seed/3,以避免获得相同的伪随机数。

答案 1 :(得分: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]

你的直觉是结果会有所不同。 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]

请注意,如果now()的返回值在两个不同的进程中相同,则会出现与上述相同的问题。这就是为什么有些人喜欢使用gen_server来包装随机数生成。或者你可以使用更好的种子。

答案 2 :(得分:2)

  

我将更乐意获得一个我能够访问的网站   在那里阅读。感谢。

您应该查看Learn You Some Erlang,它将引导您完成该语言。

答案 3 :(得分:2)

来自加密模块的伪随机数生成器工作得更好crypto:rand_uniform(From, To) 要生成一个1000个元素的列表,其中包含1到10之间的随机数:

crypto:start(),
[crypto:rand_uniform(1, 10) || _ <- lists:seq(1, 1000)].

答案 4 :(得分:0)

来自Erlang Central wiki:

http://erlangcentral.org/wiki/index.php?title=Random_Numbers

其中N =没有项目,StartVal =最小值,Lim =最大值

generate_random_int_list(N,StartVal,Lim) ->
    lists:map(fun (_) -> random:uniform(Lim-StartVal) + StartVal end, lists:seq(1,N)).

答案 5 :(得分:0)

首先需要正确播种。

_ = rand:seed(exs1024s),
[rand:uniform(100) || _ <- lists:seq(1, 1000)].