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

14

我相信有相应的函数可以完成这个任务。我只需要创建一个由1000个随机数字组成的列表。

6个回答

26
生成一个包含1000个元素的列表,其中的数字是1到10之间的随机数:
[rand:uniform(10) || _ <- lists:seq(1, 1000)].

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

对于Erlang 18.0以下版本:请使用random模块。注意!您需要在每个进程中使用它之前运行random:seed/3以避免获得相同的伪随机数。


使用当前时间作为种子的伪随机数生成器将无法获得“真正的随机数”,它们也不会具有加密安全性。你的意思是每个进程都应该使用自己的种子,这样它们就不会得到相同的伪随机数。 - Filip Haglund

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

4
now()保证在同一节点中不会两次给出相同的结果。 - Emil Vikström
4
crypto 模块中有其他更强的随机数生成器(请参见 http://www.erlang.org/doc/man/crypto.html)。 - Tilman

2
你可以查看Learn You Some Erlang,这个网站会指导你学习这门语言。同时,我很愿意帮助你在这个网站上阅读内容。谢谢。

2

使用crypto模块的伪随机数生成器可以更好地工作,方法是 crypto:rand_uniform(From, To)
要生成一个包含1000个元素的列表,其中的随机数在1到10之间:

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

1

0

首先,您需要正确地进行种子设置。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接