Question simple, mais je suis intéressé par les nuances ici.
Je génère des booléens aléatoires en utilisant la méthode suivante que j'ai inventée moi-même:
const rand = Boolean(Math.round(Math.random()));
Chaque fois que cela se random()
présente, il semble qu'il y ait toujours un écueil - ce n'est pas vraiment aléatoire, c'est compromis par quelque chose ou autre, etc. Donc, j'aimerais savoir:
a) Est-ce que ce qui précède est la meilleure façon de procéder?
b) Est-ce que je réfléchis trop aux choses?
c) Est-ce que je réfléchis aux choses?
d) Y a-t-il un moyen meilleur / plus rapide / élégant que je ne connais pas?
(Aussi un peu intéressé si B et C sont mutuellement exclusifs.)
Mettre à jour
Si cela fait une différence, j'utilise ceci pour le mouvement d'un personnage IA.
const rand = Math.random() < 0.5
est équivalent et plus simple.math.random
devrait être suffisant. Utilisez simplement des millisecondes pour votre graine.Boolean(+Date.now()%2)
Réponses:
Techniquement, le code semble correct, mais juste un peu trop complexe. Vous pouvez comparer
Math.random()
à0.5
directement, comme la gamme deMath.random()
est -[0, 1)
(ce qui signifie « dans la plage de 0 à 1 , y compris 0, mais pas 1 »). Vous pouvez diviser la plage en[0, 0.5)
et[0.5, 1)
.la source
let
ielet randomBool = Math.random() >= 0.5;
<
au lieu de>=
?Math.random() < 0.5
est exclusif de 0,5 pour la moitié basse et exclusif de 1 pour la moitié haute - donc c'est toujours exactement une chance de 50%. De plus, c'est plus court. Et à mon avis,Math.random() < 0.1
est plus intuitif à lire comme "10% de chance de vrai" queMath.random() >= 0.9
. Je suppose que c'est assez difficile cependant. Bonne réponse.Si votre projet l'a fait,
lodash
vous pouvez:la source
Pour une valeur plus sécurisée cryptographiquement, vous pouvez utiliser
crypto.getRandomValues
dans les navigateurs modernes.Échantillon:
Notez que l'
crypto
objet est une API DOM, il n'est donc pas disponible dans Node, mais il existe une API similaire pour Node .la source
Math.random()
est notoirement non aléatoire à bien des égards, excellente suggestion alternativea[0] > 127
la source
Impressionné par la réponse de Kelvin, je voudrais suggérer une solution assez similaire mais légèrement améliorée.
Cette solution est un peu plus évidente à lire, car le nombre à droite de
<
vous indique la probabilité d'obtenirtrue
plutôt que d'obtenirfalse
, ce qui est plus naturel à comprendre.<
Un symbole est également plus court que>=
;la source
Solution potentiellement plus rapide ...
Vous pouvez également envisager l'approche d'opérateur Bitwise à laquelle je viens de penser
Math.random() + .5 >> 0
, je ne sais pas si c'est plus rapide, mais voici un test de performance à tester par vous-même.Le moyen le plus courant d'obtenir un booléen aléatoire est la réponse
Math.random() >= .5
de KelvinLa seule raison d'utiliser cette
Math.round(Math.random())
approche est la simplicité et la paresse.la source
(.49999999999999997 >= .5) != (.49999999999999997+ .5 >> 0)
(.49999999999999997 >=.5) == (.49999999999999991 +.5>>0)
et(.49999999999999998 >=.5) == (.49999999999999992 +.5>>0)
c'est à la fois vrai. Également dans la version bit à bit, nous définissons la chance d'obtenir vrai, tandis que l'exemple comparatif nous définissons la chance d'obtenir faux. Donc .2 équivaudrait à environ 20% de chance de vrai dans le bit, ou à 20% de faux dans l'approche comparative.Celui-ci, ça va?
la source
Réponse d' Alexandre O'Mara
ajouter simplement un extrait de code de nœud
la source