2010-12-16 13 views
7

¿Es esto correcto? utilizando - http://en.wikipedia.org/wiki/Binomial_probability¿Cuáles son las posibilidades de que JavaScript Math.Random() cree el mismo número dos veces seguidas?

Parece que los valores son 0,0000000000000000-0,9999999999999999

probabilidad de ocurrir dos veces = P^2 = (1/9999999999999999)^2 = 1.0 E-32

creo que soy falta algo aquí?

Además, ¿cómo es que un generador de números pseudoaleatorios cambia este cálculo?

Gracias.

+3

uno que pueda afectar siendo un pseudo aleatoria, se calcularlos tan rápido, sin tiempo para cambiar la semilla, por lo que producirá el mismo número. Creo que la mayoría lo afectará porque será dependiente de la semilla. –

+3

En realidad, @Eric, eso no es correcto. Cambiar la semilla periódicamente hace que los números no sean más aleatorios, y muy probablemente menos aleatorios porque el estado inicial cambia de manera computable. Hay algunos defectos criptográficos oscuros preciosos que aparecen de esa manera. –

+1

@ Charlie, eso dependerá de la implementación, no sé cómo funciona JS al azar. Cuando comencé a programar, ese fue uno de mis primeros problemas al obtener la misma repetición aleatoria. Y me perdí de leer el título, por lo que @Tommy es probable que sea incorrecto lo que dije. –

Respuesta

4

En un mundo ideal, Math.random() sería absolutamente aleatorio, con una salida completamente independiente de otra, que (suponiendo que p = la probabilidad de que se produzca un número dado) da como resultado una probabilidad de p^2 para cualquier valor que se repite inmediatamente después de otro (como otros ya han dicho).

En la práctica, las personas quieren que Math.random sea rápido, lo que significa que los motores utilizan generadores de números pseudoaleatorios. Hay muchos tipos diferentes de PRNG pero el más básico es un generador de congruencia lineal, que es básicamente una función a lo largo de las líneas de:

s(n + 1) = some_prime * s(n) + some_value mod some_other_prime 

Si se utiliza un generador de este tipo, entonces no verá un valor repite hasta usted ha llamado random()some_other_prime veces. Estás garantizado de eso.

Relativamente recientemente, sin embargo, es evidente que este tipo de comportamiento (junto con la propagación de los PRNG con la hora actual) podría utilizarse para rastrear formularios, lo que hace que los navegadores realicen una serie de acciones que impliquen no poder asumir nada acerca de las siguientes llamadas random().

+0

Interesante, entonces nunca podría haber dos números seguidos usando Math.Random()? –

+1

Solo en navegadores antiguos (accidentalmente presiono enviar antes de terminar la publicación).Para evitar ciertas operaciones de rastreo, los navegadores pueden resembrar periódicamente el PRNG, no usar LCG, etc., que hacen que eso ya no sea cierto. – olliej

+2

Por supuesto, también está asumiendo que nadie más está llamando al azar() - si está llamando al azar() en un temporizador (por ejemplo), entonces puede ejecutar otra página antes que usted, y llame al azar(), lo que podría cambiar cosas. – olliej

2

Si los números fueran realmente aleatorios, esperaría que aparecieran con probabilidad 1/p, por lo que el doble sería 1/p^2.

El valor de p no es exactamente el que usted tiene, porque los números se representan internamente como binarios. Calcule cuántos bits de mantisa tienen los números en javascript y utilícelos para su recuento combinatorio.

La parte "pseudoaleatoria" es más interesante, porque las propiedades de los generadores de números pseudoaleatorios varían. Knuth hace un trabajo precioso con eso en Algoritmos Seminumerical, pero básicamente los generadores de PN más comunes tienen al menos alguna distribución espectral. Los generadores criptográficos PN son generalmente más fuertes.

Actualización: La cantidad de tiempo no debe ser significativa. Si es un milisegundo o un año, siempre y cuando no actualice el estado. Las probabilidades serán las mismas.

+0

¿Hay alguna posibilidad mayor que 0, que podría generar el mismo número dos veces, siendo representada por bits y pseudo aleatorio? –

+0

Charlie, también ver Tikhons asumir las matemáticas, tal vez p^2 es incorrecto? –

+0

Parece mantita de 52 bits: http://stackoverflow.com/questions/307179/what-is-javascripts-max-int-whats-the-highest-integer-value-a-number-can-go-to –

5

Creo que la probabilidad de obtener dos números seguidos es 1 dividido por el rango del generador, suponiendo que tenga una buena distribución.

La razón de esto es que el primer número puede ser cualquier cosa, y el segundo número debe volver a ser ese número, lo que significa que no nos importa el primer número. La probabilidad de obtener el mismo número dos veces seguidas es la misma que la probabilidad de obtener número particular de una vez.

Obteniendo un número particular dos veces seguidas, p. Ej. dos 0.5s en una fila, sería p^2; sin embargo, si solo le interesan el número dos veces seguidas, es solo p.

+0

Así que estoy viendo la parte matemática de este error .... –

+2

Creo que sí, sí. Imagine que tiene un dado que va del 1 al 6. Las posibilidades de lanzar dos seises es 1/(6 * 6); sin embargo, la posibilidad de lanzar dos mismos números es la suma de la probabilidad de tirar dos, dos, etc. Esto es 6 * (1/(6 * 6)) o solo 1 // 6. –

+0

¿No está rodando dos seises lo mismo que rodar dos mismos números por definición? (solo 1 muere en estos ejemplos ¿no?) –

2

La probabilidad de que obtenga 2 dando números es (1/p)^2, pero la probabilidad de que obtenga 2 de los mismos números (cualquiera) es 1/p. Esto se debe a que el primer número puede ser cualquier cosa, y el segundo solo necesita coincidir con eso.

1

Puede tipo de averiguarlo, simplemente se deja correr unos días :)

var last = 0.1; 
var count = 0 | 0; 
function rand(){ 
    ++count; 
    var num = Math.random(); 
    if(num === last){ 
     console.log('count: '+count+' num: '+num); 
    } 
    last = num; 
} 
while(true) rand(); 
Cuestiones relacionadas