Простой вопрос, но меня здесь интересуют нюансы.
Я генерирую случайные логические значения, используя следующий метод, который придумал сам:
const rand = Boolean(Math.round(Math.random()));
random()
Кажется, что всякий раз, когда он появляется, всегда есть ловушка - это не совсем случайность, что-то скомпрометировано и т. Д. Итак, я хотел бы знать:
а) Это лучший способ сделать это?
б) Я слишком много думаю о вещах?
в) Я что-то недооцениваю?
г) Есть ли способ лучше / быстрее / элегантнее, о котором я не знаю?
(Также несколько интересно, являются ли B и C взаимоисключающими.)
Обновить
Если это имеет значение, я использую это для передвижения персонажа AI.
const rand = Math.random() < 0.5
эквивалентно и проще.math.random
должно быть много. Просто используйте миллисекунды для своего семени.Boolean(+Date.now()%2)
Ответы:
Технически код выглядит неплохо, но слишком сложно. Вы можете сравнить
Math.random()
с0.5
непосредственно, как диапазонMath.random()
IS[0, 1)
(это означает , что «в диапазоне от 0 до 1 , включая 0, но не 1»). Вы можете разделить диапазон на[0, 0.5)
и[0.5, 1)
.источник
let
ielet randomBool = Math.random() >= 0.5;
<
вместо>=
?Math.random() < 0.5
не включает 0,5 для низкой половины и не включает 1 для высокой половины, так что это все равно точно 50% шанс. Плюс короче. И, на мой взгляд,Math.random() < 0.1
более интуитивно понятнее читать «10% -й шанс истины», чемMath.random() >= 0.9
. Я думаю, это довольно разборчиво. Хороший ответ.Если у вас есть проект,
lodash
вы можете:источник
Для более криптографически безопасного значения вы можете использовать
crypto.getRandomValues
в современных браузерах.Образец:
Обратите внимание, что
crypto
объект представляет собой DOM API, поэтому он недоступен в Node, но есть аналогичный API для Node .источник
Math.random()
общеизвестно неслучайно во многих отношениях, отличное альтернативное предложениеa[0] > 127
источник
Впечатленный ответом Кельвина, я хотел бы предложить довольно похожее, но немного улучшенное решение.
Это решение немного более очевидно для чтения, потому что число в правой части
<
говорит вам о вероятности получить,true
а не получитьfalse
, что более естественно для понимания. Также<
на один символ короче>=
;источник
Возможно более быстрое решение ...
Вы также можете рассмотреть подход побитового оператора, о котором я только что подумал
Math.random() + .5 >> 0
, не уверен, что он быстрее, но вот тест производительности, который вы можете проверить самостоятельно.Наиболее распространенный способ получения случайной булевой является
Math.random() >= .5
от ответа КельвинаЕдинственная причина использовать такой
Math.round(Math.random())
подход - простота и лень.источник
(.49999999999999997 >= .5) != (.49999999999999997+ .5 >> 0)
(.49999999999999997 >=.5) == (.49999999999999991 +.5>>0)
и это(.49999999999999998 >=.5) == (.49999999999999992 +.5>>0)
правда. Также в побитовой версии мы определяем шанс получить истину, а в сравнительном примере мы определяем шанс получить ложь. Таким образом, .2 будет примерно равняться примерно 20% вероятности истинности при побитовой обработке или 20%Как насчет этого?
источник
Ответ Александра О'Мара
просто добавляем фрагмент кода узла
источник