Я уверен, что для этого есть функция. Я просто хочу составить список из 1000 номеров, каждый из которых должен быть случайным.
Как создать список из 1000 случайных чисел в Erlang?
Ответ 1
Чтобы создать список из 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
, прежде чем использовать его для каждого процесса, чтобы избежать получения одинаковых псевдослучайных чисел.
Ответ 2
Удостоверьтесь в правильном посеве.
> 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]
Ваша интуиция заключается в том, что результаты будут разными. Случайное семя в Эрланге зависит от процесса. Исправлено семя по умолчанию. Вот почему вы получаете тот же результат, хотя в примере есть два процесса.
> 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
для формирования случайных чисел. В качестве альтернативы вы можете использовать лучшие семена.
Ответ 3
Я буду более счастлив получить также сайт, на котором я смогу прочитайте его там. спасибо.
Вы должны проверить Learn You Some Erlang, который проведет вас через этот язык.
Ответ 4
Генератор псевдослучайных чисел из криптового модуля работает лучше crypto:rand_uniform(From, To)
.
Чтобы создать список из 1000 элементов со случайными номерами от 1 до 10:
crypto:start(),
[crypto:rand_uniform(1, 10) || _ <- lists:seq(1, 1000)].
Ответ 5
Из 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)).