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/0oruniform/1を最初にシードを設定せずに呼び出すと、seed/0自動的に呼び出されます。 は、デフォルト (固定)seed/0値で乱数生成をシードします。この値は、 からアクセスできます。私のラップトップでは、常にデフォルトのプロセス辞書が返されます。seed0/0{3172,9814,20125}

これを実現するためにコードを変更するにはどうすればよいですか?

最も単純なケースでは、@EmilVikström のソリューションで十分です。ただし、乱数の生成状態を追跡することをお勧めし ます。これにより、デバッグ時に楽に作業できます。

乱数生成状態は、 によって返されるように、整数の 3 タプルですnow()。シードは最初の状態です。次に、uniform_s/1またはを使用uniform_s/2して、指定された状態から乱数を生成できます。

これらの関数を状態で使用することにより、Erlang コードの外部で乱数シードを指定できます。たとえば、コマンドライン オプションまたは環境変数を介してシードを渡すことができます。

  • テスト/デバッグするときは、シードを修正して、プログラムを実行するたびに同じ結果が得られるようにします。
  • 満足したら、(おそらく) デバッグを続行するためにシードを変更します :-)
  • 生産の準備ができたら、現在の時刻 (または何でも) をシードとして渡すだけで、ある程度のランダム性を持たせることができます。
于 2012-11-15T04:43:42.997 に答える