¿Por qué si uso un generador de números aleatorios y un rango de 0 a 9 no obtengo la misma distribución uniforme que la combinación con la función de piso?Números aleatorios y función de piso contra redondo
Respuesta
Math.floor(Math.random() * 10)
ofrece una distribución bastante uniforme, mientras que Math.round(Math.random() * 10)
no.
Math.floor() devuelve 0 para cualquier valor en el intervalo [0, 1) (1 exclusiva), 1 para cualquier valor en el intervalo [1, 2), etc.
Así que si tenemos Igual posibilidad de obtener un número en uno de estos rangos, obtendremos una distribución igual de 0 y 1.
Math.round(), sin embargo, devuelve 0 para valores por debajo de 0,5, 1 para valores por debajo de 1,5, etc.
así que en realidad tienen la mitad de las posibilidades de conseguir un 0, como valores sólo de 0 a 0,5 redondeará a 0.
╔═════════╦═════════╦═════════╗
║ Range ║ floor() ║ round() ║
╠═════════╬═════════╬═════════╣
║ [0, 1) ║ 0 ║ 0 or 1 ║
║ [1, 2) ║ 1 ║ 1 or 2 ║
║ [2, 3) ║ 2 ║ 2 or 3 ║
║ ... ║ ... ║ ... ║
║ [9, 10) ║ 9 ║ 9 or 10 ║
╚═════════╩═════════╩═════════╝
sí, eso es lo que estoy haciendo en este momento. Pero estoy preguntando ** por qué ** sin piso esta distribución no es tan uniforme como con piso. – user336635
@ user336635: http://jsfiddle.net/pimvdb/fPJ6Q/ Bastante uniforme ... – pimvdb
Imagina una línea en papel cuadriculado, 10 cuadrados de largo. 0 a la izquierda, 10 a la derecha, 5 a la derecha en el medio. Si usa round(), entonces la región medio cuadrado a la izquierda de 5, * y * medio cuadrado a la derecha de 5, se mapeará a 5. Sin embargo, solo la mitad de un cuadrado a la derecha de 0 se mapea a 0, no hay medio cuadrado a la izquierda de 0 en la línea. Cuando use floor(), solo los valores de un cuadrado a la derecha de n se asignarán a n, usted reducirá el número de resultados posibles, ya que no puede obtener 10 más. Sin embargo, cada uno de los 10 posibles resultados (0-9 inc) tiene el mismo "porcentaje" de la línea, y por lo tanto las mismas probabilidades de ocurrir. – Sophistifunk
me gusta mucho para desencadenar int de 31 bits en lugar de Math.floor()
, haciendo un binario "0 o" la operación. Lo hace un poco más rápido (stack vs heap,) parece un poco más limpio, y hace lo mismo, en un sentido práctico. Aquí hay un ejemplo que pone un elemento aleatorio de una matriz:
var ar=[1,2,3,4,5,6,7,8,9,0,'a','b','c','d']
console.log(ar[(Math.random() * ar.length) |0])
Esto podría parecer como la optimización prematura, pero como dije, me gusta cómo se ve y se tarda menos tipificación de Math.floor()
. Usando Math.round()
requeriría un paso adicional (debido a la propagación es 1
-ar.length
no 0
-ar.length-1
)
¿Cómo sabes que es un poco más rápido y, perdón por mi ignorancia, qué es pila vs. montón? Sé que tienen algo que ver con los algoritmos de clasificación – Anthony
https://jsperf.com/random-array-item muestra que es un poco más rápido en mi navegador (en promedio, aproximadamente ± 0.5% - x ± 0.8% en Mac Chrome Versión 58.0 .3029.110 (64-bit)) aquí hay más información sobre stack/heap: http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap the '| 0' lo fuerza en int32 (lo redondea y lo escribe) para que pueda sentarse en la pila, mientras que los Números generales siempre están en el montón (en caso de que terminen siendo más grandes o tengan un punto decimal) – konsumer
No hay una gran diferencia en la velocidad, pero es pequeño, y como dije, creo que se ve bien, también. – konsumer
- 1. CGFloat: redondo, piso, abs y precisión de 32/64 bit
- 2. NSDecimalNumber redondo números largos
- 3. Haskell y números aleatorios
- 4. Números aleatorios y negativos
- 5. Números aleatorios int64 y float64
- 6. Probabilidad de números aleatorios
- 7. Semillas() y números aleatorios en Python
- 8. Números aleatorios no repetitivos
- 9. especial de números aleatorios
- 10. Análisis de números aleatorios
- 11. C división entera y piso
- 12. Haskell recursión con números aleatorios y IO
- 13. Generación concurrente de números aleatorios
- 14. Robusta generación de números aleatorios
- 15. Gran generación de números aleatorios
- 16. números aleatorios en Java
- 17. Números aleatorios usando C#
- 18. Números aleatorios en C
- 19. Cómo generar manualmente números aleatorios
- 20. c - generador de números aleatorios
- 21. Boost generador de números aleatorios
- 22. de números aleatorios con semilla
- 23. Crappy generador de números aleatorios
- 24. Generación de números aleatorios distribuidos
- 25. Generador de números aleatorios sesgado
- 26. no repetición de números aleatorios
- 27. ¿Cómo puedo generar números aleatorios sin la función rand()?
- 28. La generación de números aleatorios en C
- 29. Cómo generar números aleatorios erróneos
- 30. Generador de números aleatorios no repetitivo
se puede añadir código de ejemplo? (y para obtener crédito adicional, algunos datos estadísticos que comparan ambos y demuestran el problema) –