Jestem pewien, że istnieje do tego funkcja. Chcę tylko utworzyć listę 1000 liczb, z których każda powinna być losowa.Jak utworzyć listę 1000 liczb losowych w Erlangu?
Odpowiedz
celu wygenerowania listy 1000 elementu losowymi liczbami między 1 a 10:
[rand:uniform(10) || _ <- lists:seq(1, 1000)].
Zmiana 10 i 1000 do odpowiednich numerów. Jeśli pominiesz 10 z połączenia rand:uniform
, otrzymasz losową liczbę zmiennoprzecinkową z zakresu od 0,0 do 1,0.
W wersjach Erlang poniżej 18,0: Zamiast tego należy użyć modułu random
. Uwaga! Musisz uruchomić random:seed/3
przed użyciem go na proces, aby uniknąć otrzymywania tych samych liczb pseudolosowych.
Upewnij się, że nasiona są odpowiednio rozmieszczone.
> 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]
Twoja intuicja jest taka, że wyniki będą inne. Losowe ziarno w Erlang jest specyficzne dla procesu. Domyślny seed jest jednak poprawiony. Dlatego otrzymujesz taki sam wynik, nawet jeśli w przykładzie są dwa procesy.
> 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]
Zauważ, że jeśli wartość zwracana now()
jest taka sama w dwóch różnych procesach skończyć z tym samym problemem, jak powyżej. Dlatego niektórzy ludzie używają gen_server
do owijania generowania liczb losowych. Alternatywnie możesz użyć lepszych nasion.
'teraz()' gwarantuje, że nigdy nie dadzą tego samego wyniku dwa razy w tym samym węźle. –
Istnieją inne silniejsze generatory liczb losowych w module 'crypto' (patrz [http://www.erlang.org/doc/man/crypto.html](http://www.erlang.org/doc/man/ crypto.html)) – Tilman
będę bardziej niż szczęśliwy, aby uzyskać także miejsce, które będę w stanie czytać go tam. dzięki.
Powinieneś sprawdzić Learn You Some Erlang, który poprowadzi Cię przez ten język.
Generator liczb pseudolosowych z modułu kryptograficznego działa lepiej crypto:rand_uniform(From, To)
.
Aby wygenerować listę 1000 elementów z liczb losowych między 1 i 10:
crypto:start(),
[crypto:rand_uniform(1, 10) || _ <- lists:seq(1, 1000)].
Od Erlang Środkowej encyklopedii:
http://erlangcentral.org/wiki/index.php?title=Random_Numbers
gdzie n = liczba elementów, StartVal = wartości minimalnej i Lim = maksymalna wartość
generate_random_int_list(N,StartVal,Lim) ->
lists:map(fun (_) -> random:uniform(Lim-StartVal) + StartVal end, lists:seq(1,N)).
To jest dobry pomysł, aby zrobić losowo: seed (teraz()). przed tym – fycth
** nie otrzymasz "prawdziwych liczb losowych" z generatora liczb pseudolosowych obsianego aktualnym czasem. Nie będą one bezpieczne pod kryptografią. Chodzi o to, że każdy proces powinien używać własnego nasienia, aby nie uzyskać tych samych liczb pseudolosowych. –
@FilipHaglund Dzięki, poprawione. –