JS генерирует случайное логическое
Простой вопрос, но меня интересуют нюансы.
Я генерирую произвольные булевы, используя следующий метод: я придумал:
const rand = Boolean(Math.round(Math.random()));
Всякий раз, когда появляется random()
, кажется, что всегда есть ловушка - это не по-настоящему случайное, оно скомпрометировано чем-то другим и т.д. Итак, я хотел бы знать:
a) Является ли вышеприведенный способ наилучшей практики?
б) Я что-то перепутаю?
c) Я что-то понимаю?
d) Есть ли лучший/быстрый/элегантный способ, о котором я не знаю?
(Также несколько интересует, если B и C взаимно исключают.)
Update
Если это имеет значение, я использую это для перемещения символа AI.
Ответы
Ответ 1
Технически, код выглядит отлично, но немного сложнее.
Вы можете сравнить "Math.random()" с "0.5" напрямую, так как диапазон Math.random() равен [0, 1). Вы можете разделить диапазон на [0, 0.5) и [0.5, 1).
var random_boolean = Math.random() >= 0.5;
Ответ 2
Если в вашем проекте есть lodash
вы можете:
_.sample([true, false])
Ответ 3
Для более криптографически безопасного значения вы можете использовать crypto.getRandomValues
в современных браузерах.
Образец:
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;
Ответ 4
!Math.round(Math.random());
Ответ 5
Как насчет этого?
return Math.round((Math.random() * 1) + 0) === 0;
Ответ 6
Ответ Александра О'Мара
просто добавив фрагмент кода узла
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);
Ответ 7
Другой способ обойти:
Boolean(Math.round(Math.random()))