【问题标题】:How to create a list of 1000 random numbers in Erlang?如何在 Erlang 中创建 1000 个随机数的列表?
【发布时间】:2012-05-06 06:50:03
【问题描述】:

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

【问题讨论】:

    标签: erlang erlang-shell


    【解决方案1】:

    要生成一个包含 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,以避免得到相同的伪随机数。

    【讨论】:

    • 您将不会从以当前时间为种子的伪随机数生成器获得“真正的随机数”。它们不会是加密安全的。你的意思是每个进程都应该使用自己的种子,所以它们不会得到相同的伪随机数。
    【解决方案2】:

    确保适当播种。

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

    【讨论】:

    【解决方案3】:

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

    您应该查看Learn You Some Erlang,它将指导您了解该语言。

    【讨论】:

      【解决方案4】:

      来自加密模块的伪随机数生成器效果更好crypto:rand_uniform(From, To)
      生成一个包含 1 到 10 个随机数的 1000 元素列表:

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

      【讨论】:

        【解决方案5】:

        来自 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)).
        

        【讨论】:

          【解决方案6】:

          您首先需要正确播种。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-09-28
            • 1970-01-01
            • 1970-01-01
            • 2023-04-11
            • 1970-01-01
            • 2014-01-11
            • 2018-07-15
            • 2011-10-20
            相关资源
            最近更新 更多