Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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)).