2012-04-25 3 views

ответ

22

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

+4

Это хорошая идея: случайное: seed (now()). до этого – fycth

+0

Вы не ** ** получите «истинные случайные числа» из генератора псевдослучайных чисел, засеянных текущим временем. Они не будут криптографически безопасными. Вы имеете в виду, что каждый процесс должен использовать свое собственное семя, поэтому они не получают одинаковые псевдослучайные числа. –

+0

@FilipHaglund Спасибо, исправлено. –

13

Удостоверьтесь в правильном посеве.

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

+4

'now()' гарантированно никогда не даст тот же результат дважды в одном и том же узле. –

+4

Существуют еще более сильные генераторы случайных чисел в модуле 'crypto' (см. [Http://www.erlang.org/doc/man/crypto.html](http://www.erlang.org/doc/man/ crypto.html)) – Tilman

2

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

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

2

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

crypto:start(), 
[crypto:rand_uniform(1, 10) || _ <- lists:seq(1, 1000)]. 
0

От Эрланга Центральной вики:

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)). 
Смежные вопросы