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.
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;
Si votre projet a lodash
alors vous pouvez:
_.sample([true, false])
Pour une valeur plus sécurisée sur le plan cryptographique, vous pouvez utiliser crypto.getRandomValues
dans les navigateurs modernes.
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 .
Une autre façon de faire:
Boolean(Math.round(Math.random()))
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);
Celui-ci, ça va?
return Math.round((Math.random() * 1) + 0) === 0;