0

为什么我在randy:spawner()下面运行时会得到一个相同数字的列表?我期待一个随机数列表。我怎样才能改变代码来实现这一点?

-module(randy).
-export([randlister/2,spawner/0]).
-import(lists,[map/2]).

spawner() ->
    [spawn(fun() -> randlister(X,random:uniform()) end) || X <- lists:seq(1,3)].


randlister(X, Randomnumber) ->
io:format("~p,    ~p~n",[X,Randomnumber]).

示例输出:

18> randy:spawner().
1,    0.4435846174457203
2,    0.4435846174457203
3,    0.4435846174457203
4

2 回答 2

5

您必须在每个进程中播种随机数生成器:

spawner() ->
    [spawn(fun() ->
                   random:seed(now()),
                   randlister(X,random:uniform())
           end) || X <- lists:seq(1,3)].
于 2012-11-13T15:37:54.390 回答
2

为什么我在randy:spawner()下面运行时会得到一个相同数字的列表?

必须在生成随机数之前播种。从同一种子生成的随机数序列将完全相同。

如果一个进程调用uniform/0uniform/1没有先设置种子,seed/0则自动调用。 将使用默认(固定)seed/0值生成随机数,可以通过. 在我的笔记本电脑上,它总是返回一个默认的进程字典。seed0/0{3172,9814,20125}

我怎样才能改变代码来实现这一点?

在最简单的情况下,@EmilVikström 的解决方案就足够了。但是,我确实建议跟踪随机数生成状态 ,以便在调试时过上更轻松的生活。

随机数生成状态只是一个 3 元组整数,由now(). 种子只是第一个状态。然后您可以使用uniform_s/1oruniform_s/2从指定状态生成随机数。

通过使用这些带状态的函数,您可以在 Erlang 代码之外指定随机数种子,例如通过命令行选项或环境变量传递种子。

  • 在测试/调试时,请修复种子,以便每次运行程序时都会给出相同的结果。
  • 当您满意时,更改种子以便(可能)继续调试:-)
  • 当您准备好进行生产时,只需将当前时间(或其他时间)作为种子传递,这样您就可以获得一些随机性。
于 2012-11-15T04:43:42.997 回答