Pregunta simple, pero estoy interesado en los matices aquí.
Estoy generando booleanos aleatorios usando el siguiente método que se me ocurrió:
const rand = Boolean(Math.round(Math.random()));
Cada vez que random()
aparece, parece que siempre hay una trampa: no es realmente aleatorio, está comprometido por algo u otro, etc. Entonces, me gustaría saber:
a) ¿Es lo anterior la mejor forma de hacerlo?
b) ¿Estoy pensando demasiado?
c) ¿Estoy sin pensar las cosas?
d) ¿Hay alguna forma mejor / más rápida / más elegante que no conozca?
(También algo interesado si B y C son mutuamente excluyentes).
Actualizar
Si hace la diferencia, estoy usando esto para el movimiento de un personaje AI.
const rand = Math.random() < 0.5
Es equivalente y más simple.math.random
debería ser suficiente. Solo usa milisegundos para tu semilla.Boolean(+Date.now()%2)
Respuestas:
Técnicamente, el código se ve bien, pero demasiado complejo. Puede comparar
Math.random()
a0.5
directamente, como la gama deMath.random()
decir[0, 1)
(esto significa 'en el rango de 0 a 1, incluyendo 0, pero no 1'). Puede dividir el rango en[0, 0.5)
y[0.5, 1)
.fuente
let
ejemplolet randomBool = Math.random() >= 0.5;
<
lugar de>=
?Math.random() < 0.5
es exclusivo de 0.5 para la mitad baja y exclusivo de 1 para la mitad alta, por lo que sigue siendo exactamente un 50% de posibilidades. Además, es más corto. Y en mi opinión,Math.random() < 0.1
es más intuitivo leerlo como "10% de posibilidades de verdad" queMath.random() >= 0.9
. Aunque supongo que eso es ser bastante exigente. Buena respuesta.Si su proyecto tiene
lodash
entonces puede:fuente
Para obtener un valor más seguro criptográficamente, puede usar
crypto.getRandomValues
en navegadores modernos.Muestra:
Tenga en cuenta que el
crypto
objeto es una API DOM, por lo que no está disponible en Node, pero hay una API similar para Node .fuente
Math.random()
es notoriamente poco aleatorio en muchos sentidos, gran sugerencia alternativaa[0] > 127
fuente
Impresionado mucho por la respuesta de Kelvin, me gustaría sugerir una solución bastante similar pero ligeramente mejorada.
Esta solución es un poco más obvia de leer, porque el número en el lado derecho de
<
le indica la probabilidad de obtener entrue
lugar de obtenerfalse
, lo cual es más natural de comprender. también<
es un símbolo más corto que>=
;fuente
Solución potencialmente más rápida ...
También puede considerar el enfoque del operador Bitwise en el que acabo de pensar
Math.random() + .5 >> 0
, no estoy seguro de si es más rápido, pero aquí hay una prueba de rendimiento para probarlo usted mismo.La forma más común de obtener booleanos aleatorios es
Math.random() >= .5
La única razón para usar el
Math.round(Math.random())
enfoque es la simplicidad y la pereza.fuente
(.49999999999999997 >= .5) != (.49999999999999997+ .5 >> 0)
¿Que tal este?
fuente
Respuesta de Alexander O'Mara
simplemente agregando un fragmento de código de nodo
fuente