2012-04-25 20 views

Respuesta

22

para generar una lista 1000-elemento con números aleatorios entre 1 y 10:

[rand:uniform(10) || _ <- lists:seq(1, 1000)]. 

Cambio 10 y 1000 a los números apropiados. Si omite el 10 de la llamada rand:uniform, obtendrá un número aleatorio de coma flotante entre 0.0 y 1.0.

En versiones de Erlang inferiores a 18.0: En su lugar, utilice el módulo random. ¡Precaución! Debe ejecutar random:seed/3 antes de usarlo por proceso, para evitar obtener los mismos números pseudoaleatorios.

+4

Esta es una buena idea para hacer random: seed (now()). antes de eso – fycth

+0

** No ** obtendrá "números aleatorios verdaderos" de un generador de números pseudoaleatorios sembrado con la hora actual. No estarán criptográficamente seguros. Lo que quiere decir es que cada proceso debe usar su propia semilla, por lo que no obtienen los mismos números pseudoaleatorios. –

+0

@FilipHaglund Gracias, corregido. –

13

Asegúrese de sembrar adecuadamente.

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

Su intuición es que los resultados serían diferentes. Una semilla aleatoria en Erlang es específica del proceso. La semilla predeterminada es fija. Es por eso que obtienes el mismo resultado a pesar de que hay dos procesos en el ejemplo.

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

Tenga en cuenta que si el valor de retorno de now() es el mismo en dos procesos diferentes que terminan con el mismo problema que el anterior. Es por eso que a algunas personas les gusta usar un gen_server para envolver la generación de números aleatorios. Alternativamente puedes usar mejores semillas.

+4

'now()' garantiza que nunca dará el mismo resultado dos veces en el mismo nodo. –

+4

Hay otros generadores de números aleatorios más fuertes en el módulo 'crypto' (ver [http://www.erlang.org/doc/man/crypto.html](http://www.erlang.org/doc/man/ crypto.html)) – Tilman

2

estaré más que feliz de obtener también un sitio que podré leer allí. Gracias.

Debe consultar Learn You Some Erlang que lo guiará por el idioma.

2

generador de números pseudoaleatorios del módulo de cifrado funciona mejor crypto:rand_uniform(From, To).
para generar una lista 1000-elemento con números aleatorios entre 1 y 10:

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