web-dev-qa-db-fra.com

JS générer des booléens aléatoires

Question simple, mais les nuances m'intéressent.

Je génère des booléens aléatoires en utilisant la méthode suivante que je me suis proposée:

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

Chaque fois que random() apparaît, il semble qu'il y ait toujours un piège - ce n'est pas vraiment aléatoire, c'est compromis par quelque chose, etc. Je voudrais donc savoir:

a) La démarche ci-dessus est-elle la meilleure méthode pour le faire? 

b) Est-ce que je réfléchis trop? 

c) Suis-je en train de penser? 

d) Existe-t-il un moyen meilleur/plus rapide/élégant-er que je ne connais pas?

(Également un peu intéressé si B et C s’excluent mutuellement.)

Mettre à jour

Si cela fait une différence, je l'utilise pour le mouvement d'un personnage IA.

66
Ben

Techniquement, le code est correct, mais un peu trop complexe. Vous pouvez comparer "Math.random ()" à "0.5" directement, car la plage de Math.random () est [0, 1). Vous pouvez diviser la plage en [0, 0.5) et [0.5, 1).

var random_boolean = Math.random() >= 0.5;
191
Kelvin

Si votre projet a lodash alors vous pouvez:

_.sample([true, false])
17
Nishant Shreshth

Pour une valeur plus sécurisée sur le plan cryptographique, vous pouvez utiliser crypto.getRandomValues dans les navigateurs modernes.

Échantillon:

var randomBool = (function() {
  var a = new Uint8Array(1);
  return function() {
    crypto.getRandomValues(a);
    return a[0] > 127;
  };
})();

var trues = 0;
var falses = 0;
for (var i = 0; i < 255; i++) {
  if (randomBool()) {
    trues++;
  }
  else {
    falses++;
  }
}
document.body.innerText = 'true: ' + trues + ', false: ' + falses;

Notez que l'objet crypto est une API DOM. Il n'est donc pas disponible dans Node, mais il existe une API similaire pour Node .

11
Alexander O'Mara

Une autre façon de faire:

Boolean(Math.round(Math.random()))
0
Damjan Pavlica

Réponse de Alexander O'Mara

il suffit d'ajouter un extrait de code de noeud

const crypto = require('crypto');
const randomBool = (function () {
    let a = new Uint8Array(1);
    return function () {
        crypto.randomFillSync(a);
        return a[0] > 127;
    };
})();

let trues = 0;
let falses = 0;
for (let i = 0; i < 100; i++) {
    if (randomBool()) {
        trues++;
    }
    else {
        falses++;
    }
}

console.log('true: ' + trues + ', false: ' + falses);

0
bFunc

Celui-ci, ça va?

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