rango - numero entero aleatorio javascript
¿Cuán aleatorio es Math.random de JavaScript? (9)
¡Parece perfectamente aleatorio para mí! (Sugerencia: depende del navegador)
Personalmente, creo que mi implementación sería mejor, aunque lo robé de XKCD , a quien SIEMPRE debería reconocer:
random = 4; // Chosen by a fair dice throw. Guaranteed to be random.
Durante 6 años, he tenido una página de generador de números aleatorios en mi sitio web. Durante mucho tiempo, fue el primer o segundo resultado en Google para "generador de números aleatorios" y se ha utilizado para decidir docenas, sino cientos de concursos y dibujos en foros de discusión y blogs (lo sé porque veo las referencias en mi Registros web y, por lo general, vaya a echar un vistazo).
Hoy, alguien me envió un correo electrónico para decirme que puede no ser tan aleatorio como pensaba. Intentó generar números aleatorios muy grandes (por ejemplo, entre 1 y 10000000000000000000) y descubrió que casi siempre tenían el mismo número de dígitos. De hecho, envolví la función en un bucle para poder generar miles de números y, efectivamente, para números muy grandes, la variación fue de solo 2 órdenes de magnitud.
¿Por qué?
Aquí está la versión de bucle, para que pueda probarlo usted mismo:
http://andrew.hedges.name/experiments/random/randomness.html
Incluye tanto una implementación directa tomada de Mozilla Developer Network como un código de 1997 que eliminé de una página web que ya no existe (Paul Houle, "Central Randomizer 1.3"). Ver fuente para ver cómo funciona cada método.
He leído here y en elsewhere sobre Mersenne Twister. Lo que me interesa es por qué no habría una mayor variación en los resultados de la función matemática incorporada de JavaScript. ¡Gracias!
Bueno, si está generando números hasta, digamos, 1e6, con suerte obtendrá todos los números con aproximadamente la misma probabilidad. Eso también significa que solo tienes una probabilidad de uno en diez de obtener un número con un dígito menos. Una de cada cien posibilidades de obtener dos dígitos menos, etc. Dudo que vea mucha diferencia cuando use otro RNG, porque tiene una distribución uniforme entre los números, no su logaritmo.
Dados números entre 1 y 100.
- 9 tienen 1 dígito (1-9)
- 90 tienen 2 dígitos (10-99)
- 1 tiene 3 dígitos (100)
Dados números entre 1 y 1000.
- 9 tienen 1 dígito
- 90 tienen 2 dígitos
- 900 tienen 3 dígitos
- 1 tiene 4 dígitos
y así.
Por lo tanto, si selecciona algunos al azar, la gran mayoría de los números seleccionados tendrá la misma cantidad de dígitos, porque la gran mayoría de los valores posibles tienen la misma cantidad de dígitos.
El siguiente artículo explica cómo math.random () en los principales navegadores web es (no) seguro: "Seguimiento temporal de usuarios en los navegadores principales y filtración de información entre dominios y ataques" por Amid Klein (2008) . No es más fuerte que las típicas funciones de PRNG integradas de Java o Windows.
Por otro lado, la implementación de SFMT del período 2 ^ 19937-1 requiere 2496 bytes del estado interno mantenido para cada secuencia de PRNG. Algunas personas pueden considerar esto como un costo imperdonable.
Hay diferentes tipos de aleatoriedad. Math.random te da una distribución uniforme de números.
Si desea diferentes órdenes de magnitud, le sugiero que use una función exponencial para crear lo que se llama una distribución de ley de poder :
function random_powerlaw(mini, maxi) {
return Math.ceil(Math.exp(Math.random()*(Math.log(maxi)-Math.log(mini)))*mini)
}
Esta función debería darle aproximadamente el mismo número de números de 1 dígito que números de 2 dígitos y números de 3 dígitos.
También hay otras distribuciones para números aleatorios como la distribución normal (también llamada distribución gaussiana).
Los números no aleatorios distribuidos uniformemente de 1 a N tienen la misma propiedad. Tenga en cuenta que (en cierto sentido) es una cuestión de precisión. Una distribución uniforme en 0-99 (como números enteros) tiene 90% de sus números que tienen dos dígitos. Una distribución uniforme en 0-999999 tiene 905 de sus números que tienen cinco dígitos.
Cualquier conjunto de números (en algunas condiciones no demasiado restrictivas) tiene una densidad. Cuando alguien quiere discutir números "aleatorios", se debe especificar la densidad de estos números (como se señaló anteriormente). Una densidad común es la densidad uniforme. Hay otros: la densidad exponencial, la densidad normal, etc. Uno debe elegir qué densidad es relevante antes de proponer un generador de números aleatorios. Además, los números que provienen de una densidad a menudo se pueden transformar fácilmente a otra densidad por medios cariados.
Probé el generador de números pseudoaleatorios JS en Chaos Game .
Mi triángulo de Sierpiński dice que es bastante aleatorio:
Si usa un número como 10000000000000000000, va más allá de la precisión del tipo de datos que está usando Javascript. Tenga en cuenta que todos los números generados terminan en "00".
Sus resultados son realmente esperados. Si los números aleatorios están uniformemente distribuidos en un rango de 1 a 10 ^ n, entonces esperaría que aproximadamente 9/10 de los números tengan n dígitos, y otros 9/100 tengan n-1 dígitos.