Подтвердить что ты не робот

JS генерирует случайное логическое

Простой вопрос, но меня интересуют нюансы.

Я генерирую произвольные булевы, используя следующий метод: я придумал:

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

Всякий раз, когда появляется random(), кажется, что всегда есть ловушка - это не по-настоящему случайное, оно скомпрометировано чем-то другим и т.д. Итак, я хотел бы знать:

a) Является ли вышеприведенный способ наилучшей практики?

б) Я что-то перепутаю?

c) Я что-то понимаю?

d) Есть ли лучший/быстрый/элегантный способ, о котором я не знаю?

(Также несколько интересует, если B и C взаимно исключают.)

Update

Если это имеет значение, я использую это для перемещения символа AI.

4b9b3361

Ответ 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()))