そのための機能があると確信しています。1000個の数字のリストを作成したいだけで、それぞれがランダムでなければなりません。
6 に答える
1 から 10 までの乱数で 1000 要素のリストを生成するには:
[rand:uniform(10) || _ <- lists:seq(1, 1000)].
10 と 1000 を適切な数値に変更します。呼び出しから 10 を省略するrand:uniform
と、0.0 から 1.0 の間のランダムな浮動小数点数が得られます。
Erlang バージョン 18.0 より前の場合:random
代わりにモジュールを使用してください。注意!random:seed/3
同じ疑似乱数を取得しないように、プロセスごとに使用する前に実行する必要があります。
適度に種をまくようにしましょう。
> 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 のランダム シードはプロセス固有です。ただし、デフォルトのシードは固定されています。この例では 2 つのプロセスがありますが、同じ結果が得られるのはそのためです。
> 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()
2 つの異なるプロセスで同じである場合、上記と同じ問題が発生することに注意してください。gen_server
これが、乱数生成のラップに を使用することを好む人がいる理由です。または、より良い種子を使用することもできます。
私はそこでそれを読むことができるサイトも手に入れることができてとても幸せです. ありがとう。
Learn You Some Erlangを確認してください。これは、言語をガイドします。
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)).