Я уверен, что для этого есть функция. Я просто хочу составить список из 1000 чисел, каждое из которых должно быть случайным.
Как создать список из 1000 случайных чисел в Erlang?
Ответы (6)
Чтобы сгенерировать список из 1000 элементов со случайными числами от 1 до 10:
[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 зависит от процесса. Однако семя по умолчанию исправлено. Вот почему вы получаете тот же результат, даже если в примере два процесса.
> 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
для генерации случайных чисел. В качестве альтернативы вы можете использовать более качественные семена.
now()
гарантированно никогда не даст один и тот же результат дважды в одном и том же узле.
- person Emil Vikström; 25.04.2012
crypto
есть другие более мощные генераторы случайных чисел (см. http://www.erlang.org/doc/man/crypto.html)
- person Tilman; 28.04.2012
Я буду более чем счастлив получить также сайт, на котором я смогу это прочитать. Благодарю.
Вы должны проверить Learn You Some Erlang, который проведет вас по языку.
Генератор псевдослучайных чисел из модуля шифрования работает лучше crypto:rand_uniform(From, To)
.
Чтобы сгенерировать список из 1000 элементов со случайными числами от 1 до 10:
crypto:start(),
[crypto:rand_uniform(1, 10) || _ <- lists:seq(1, 1000)].
Из вики Erlang Central:
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)).
В первую очередь нужно правильно посеять.
_ = rand:seed(exs1024s),
[rand:uniform(100) || _ <- lists:seq(1, 1000)].