Как создать список из 1000 случайных чисел в Erlang?

Я уверен, что для этого есть функция. Я просто хочу составить список из 1000 чисел, каждое из которых должно быть случайным.


person USer22999299    schedule 25.04.2012    source источник


Ответы (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, прежде чем использовать его для каждого процесса, чтобы избежать получения одинаковых псевдослучайных чисел.

person Adam Lindberg    schedule 25.04.2012
comment
Вы не получите настоящие случайные числа от генератора псевдослучайных чисел, засеянного текущим временем. Они не будут криптографически безопасными. Вы имеете в виду, что каждый процесс должен использовать свое собственное начальное число, чтобы они не получали одинаковые псевдослучайные числа. - person Filip Haglund; 16.07.2016

Удостоверьтесь, что посеяли правильно.

 > 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 для генерации случайных чисел. В качестве альтернативы вы можете использовать более качественные семена.

person Tilman    schedule 25.04.2012
comment
Однако now() гарантированно никогда не даст один и тот же результат дважды в одном и том же узле. - person Emil Vikström; 25.04.2012
comment
В модуле crypto есть другие более мощные генераторы случайных чисел (см. http://www.erlang.org/doc/man/crypto.html) - person Tilman; 28.04.2012

Я буду более чем счастлив получить также сайт, на котором я смогу это прочитать. Благодарю.

Вы должны проверить Learn You Some Erlang, который проведет вас по языку.

person Emil Vikström    schedule 25.04.2012

Генератор псевдослучайных чисел из модуля шифрования работает лучше crypto:rand_uniform(From, To).
Чтобы сгенерировать список из 1000 элементов со случайными числами от 1 до 10:

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

Из вики 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)).
person Ashwin    schedule 25.11.2014

В первую очередь нужно правильно посеять.

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