2011-04-19 20 views
5

Oye, ¿hay alguna manera de elegir números aleatorios distribuidos de manera uniforme? He utilizado esta funciónnúmeros aleatorios distribuidos de manera uniforme

Math.floor(Math.random()*2) 

que devuelve 1 o 0. Sin embargo, yo no creo que tiene 50% de probabilidad exacta para producir cualquiera de ellos. ¿Mejores pensamientos? Gracias

+0

IMO esto está bien. 'Math.random() * 2' devuelve un número entre 0 y digamos 1.99; piso le dará 0 para los valores 0-0.99 y 1 para los valores 1-1.99, por lo que es bastante uniforme. Pero me temo que alguien tiene una mejor idea. –

+1

¿Por qué no crees que es exactamente el 50% para cualquiera de los dos? Ejecutar esto 10000 veces y promediar los resultados me da 0.5026 que es casi exactamente 50% 0's 50% 1's. (Eso está en Firefox 4) – asm

Respuesta

5

Si usted no cree, compruebe:

<script type="text/javascript"> 
var total = 0; 
var ones = 0; 
for (var i = 0; i < 100000; i++, total++) { 
    ones += Math.floor(Math.random()*2); 
} 
alert(ones/total); 
</script> 

Este código me da 0,49972 - muy cerca 50%.

0

Genera 0 o 1 con las mismas posibilidades.

Pero ¿por qué no se utiliza:

Math.round(Math.random()) 

? ¿Desea poder cambiar para generar 0, 1, 2, ..., N? Si es así, mantenga su implementación.

0

La posibilidad de obtener un resultado es exactamente del 50%. ¿Qué te hace pensar que no es así?

1

Es lo suficientemente cerca del 50% hasta el punto que, si usted está preocupado acerca de una discrepancia (si es que lo hay), no estaría utilizando números pseudo aleatorios en primer lugar :-)

Ejecutando un ciclo con 10 millones de iteraciones me da una razón de 5,000,931 a 4,999,069 que es un error de solo uno en diez mil (0.00931 por ciento).

4

Debe darle una distribución pareja.

var a=new Array(0,0); for (i=0; i<100000; i++) a[Math.floor(Math.random() * 2)]++; alert(a); 

se puede probar mediante copiar y pegar a la addressbar:

javascript:var a=new Array(0,0); for (i=0; i<100000; i++) a[Math.floor(Math.random() * 2)]++; alert(a); 
+0

Ooh, ese es un truco ingenioso que no había visto antes (codificación de JavaScript en la barra de direcciones). No más escribir archivos HTML con fuente incrustada para mí. ¡+1 solo por eso! – paxdiablo

+0

@paxdiablo O podrías usar la consola de Firebug en Firefox, la consola incluida de Chrome, la consola incluida de Opera. No sé sobre otros navegadores, pero probablemente también tengan plugins o herramientas. –

3

Haga la prueba:

<script type="text/javascript"> 

var zero=0; 
var one=0; 

for (var i=0;i<1000000;i++) 
{ 
    var num=Math.floor(Math.random()*2) 
    if (num) zero++; 
    if (!num) one++; 
} 

document.write("Zero: "+zero+"<br />"); 
document.write("One: "+one+"<br />"); 

</script> 

Usted está buscando respuestas en este caso que son buenas dentro de la raíz cuadrada de un millón. es decir, desea que los resultados sean de 500,000 + - 1000 si obtiene números verdaderamente aleatorios.