Durante 6 años he tenido una página generadora 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 decenas, si no 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, ve a echar un vistazo).
Hoy, alguien me envió un correo electrónico para decirme que puede que no sea 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 en bucle, para que pueda probarla usted mismo:
http://andrew.hedges.name/experiments/random/randomness.html
Incluye tanto una implementación sencilla tomada de Mozilla Developer Network como un código de 1997 que borré de una página web que ya no existe ("Central Randomizer 1.3" de Paul Houle). Ver fuente para ver cómo funciona cada método.
He leído aquí y en otros lugares sobre Mersenne Twister. Lo que me interesa es por qué no habría una mayor variación en los resultados de la función Math.random incorporada de JavaScript . ¡Gracias!
fuente
Respuestas:
Dados números entre 1 y 100.
Dados números entre 1 y 1000.
y así.
Entonces, si selecciona algunos al azar, entonces la gran mayoría de los números seleccionados tendrán el mismo número de dígitos, porque la gran mayoría de los valores posibles tienen el mismo número de dígitos.
fuente
Realmente se esperan sus resultados. Si los números aleatorios se distribuyen uniformemente en un rango de 1 a 10 ^ n, entonces esperaría que alrededor de 9/10 de los números tuvieran n dígitos y otros 9/100 tuvieran n-1 dígitos.
fuente
Existen diferentes tipos de aleatoriedad. Math.random te da una distribución uniforme de números.
Si desea diferentes órdenes de magnitud, sugeriría usar una función exponencial para crear lo que se llama una distribución de ley de potencia :
Esta función debería proporcionarle aproximadamente la misma cantidad 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).
fuente
minimum = 1
y elmaximum = 10
y, a veces, obtendría 11 como resultado. Probablemente quisiste usar enMath.floor
lugar deMath.round
¡Me parece perfectamente aleatorio! (Sugerencia: depende del navegador).
Personalmente, creo que mi implementación sería mejor, aunque se la robé a XKCD , quien SIEMPRE debería ser reconocido:
fuente
El siguiente artículo explica cómo math.random () en los principales navegadores web es (no) seguro: "Seguimiento temporal de usuarios en los principales navegadores y fugas y ataques de información entre dominios" por Amid Klein (2008) . No es más fuerte que las funciones PRNG integradas típicas de Java o Windows.
Por otro lado, implementar SFMT del período 2 ^ 19937-1 requiere 2496 bytes del estado interno mantenido para cada secuencia PRNG. Algunas personas pueden considerar esto como un costo imperdonable.
fuente
Si utiliza un número como 10000000000000000000, va más allá de la precisión del tipo de datos que utiliza Javascript. Tenga en cuenta que todos los números generados terminan en "00".
fuente
Probé el generador de números pseudoaleatorios JS en Chaos Game .
Mi triángulo de Sierpiński dice que es bastante aleatorio:
fuente
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 posibilidad entre diez de obtener un número con un dígito menos. Una probabilidad de uno en cien de obtener dos dígitos menos, etc. Dudo que veas mucha diferencia al usar otro RNG, porque tienes una distribución uniforme entre los números, no su logaritmo.
fuente
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 de 0 a 99 (como números enteros) tiene el 90% de sus números con dos dígitos. Una distribución uniforme en 0-999999 tiene 905 de sus números con cinco dígitos.
Cualquier conjunto de números (bajo algunas condiciones no demasiado restrictivas) tiene una densidad. Cuando alguien quiera hablar de números "aleatorios", se debe especificar la densidad de estos números (como se indicó anteriormente). Una densidad común es la densidad uniforme. Hay otras: la densidad exponencial, la densidad normal, etc. Hay que 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 en otra densidad por medios cariados.
fuente