198 votes

JS génère un booléen aléatoire

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 moi-même mise au point:

const rand = Boolean(Math.round(Math.random()));

Chaque fois que random() apparaît, il semble y avoir toujours un piège - ce n'est pas vraiment aléatoire, c'est compromis par quelque chose ou autre, etc. Donc, j'aimerais savoir:

a) Est-ce la meilleure pratique pour le faire?

b) Est-ce que je me prends trop la tête?

c) Est-ce que je ne réfléchis pas assez?

d) Existe-t-il une meilleure / plus rapide / plus élégante façon que je ne connais pas?

(Aussi un peu intéressé de savoir si B et C sont mutuellement exclusifs.)

Mise à jour

Si cela fait une différence, j'utilise ceci pour le déplacement d'un personnage AI.

43 votes

const rand = Math.random() < 0.5 est équivalent et plus simple.

3 votes

Vous ne pouvez atteindre que pseudo-aléatoire, pas de vrai aléatoire.

1 votes

Rien n'est en fait aléatoire, le but est d'atteindre le plus près possible de l'aléatoire.

1voto

LeonNikolai Points 82

Des solutions potentiellement plus rapides...

Approche des opérateurs bit à bit que je viens de penser Math.random() + .5 >> 0 ou ~~(Math.random() + .5). Voici un test de performance pour juger par vous-même.

let randomBoolean = Math.random() + .5 >> 0;                 //chance d'être vrai
const randomBoolean = chance => Math.random() + chance >> 0; //chance d'être vrai

Les opérateurs bit à bit sont dans ce cas essentiellement les mêmes que d'utiliser Math.trunc() ou Math.floor(), donc c'est aussi possible Math.trunc(Math.random() + .5).

let randomBoolean = Math.trunc(Math.random() + .5);
const randomBoolean = chance => Math.trunc(Math.random() + chance);

Autres solutions plus courantes

La façon la plus courante d'obtenir un booléen aléatoire est probablement une approche comparative comme Math.random() >= .5 de la réponse de Kelvin ou Math.random() < .5; de la réponse de Arthur Khazbs, ils affichent en réalité true et false, et non 1 et 0.

let randomBoolean = Math.random() >= .5;                 //chance d'être faux
const randomBoolean = chance => Math.random() >= chance; //chance d'être faux

let randomBoolean = Math.random()  < .5;                 //chance d'être vrai
const randomBoolean = chance => Math.random() < chance;  //chance d'être vrai

La seule raison d'utiliser l'approche Math.round(Math.random()) est la simplicité et la paresse.

0voto

Alex Points 276

Que diriez-vous de celui-ci ?

return Math.round((Math.random() * 1) + 0) === 0;

1 votes

OP affirme qu'il utilise déjà des méthodes similaires, pas besoin de poster cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X