2012-04-25 17 views

Odpowiedz

22

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.

+4

To jest dobry pomysł, aby zrobić losowo: seed (teraz()). przed tym – fycth

+0

** 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. –

+0

@FilipHaglund Dzięki, poprawione. –

13

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.

+4

'teraz()' gwarantuje, że nigdy nie dadzą tego samego wyniku dwa razy w tym samym węźle. –

+4

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

2

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.

2

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)].