JS生成随机布尔值

Ben*_*Ben 107 javascript random boolean

简单的问题,但我对这里的细微差别感兴趣.

我使用我自己提出的以下方法生成随机布尔值:

const rand = Boolean(Math.round(Math.random()));
Run Code Online (Sandbox Code Playgroud)

每当random()出现时,似乎总会有一个陷阱 - 它不是真正随机的,它会被某种东西或其他东西所破坏等等.所以,我想知道:

a)以上是最佳实践方法吗?

b)我是否在思考事物?

c)我是否解开了事情?

d)我不知道有更好/更快/更优雅的方式吗?

(如果B和C相互排斥,也有点兴趣.)

更新

如果它有所不同,我将其用于移动AI角色.

Kel*_*vin 262

从技术上讲,代码看起来很好,但有点太复杂了.您可以直接将"Math.random()"与"0.5"进行比较,因为Math.random()的范围是[0,1].您可以将范围分为[0,0.5)和[0.5,1].

var random_boolean = Math.random() >= 0.5;
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个解决方案,因为它允许您调整真/假的概率 (11认同)
  • 为什么不只使用`<`而不是`>=`?`Math.random() < 0.5` 不包括低半部分的 0.5 和高半部分的 1 - 所以它仍然有 50% 的机会。另外,它更短。在我看来,“Math.random() < 0.1”比“Math.random() >= 0.9”更直观地理解为“10% 的概率为真”。我想这还是相当挑剔的。很好的答案。 (9认同)
  • @bjrne你是对的;最后编辑这个答案的人犯了这个错误。我继续更新了答案以反映您的建议,并从“>=”转向“<”。 (3认同)
  • 我修改了答案以使用 `<=` 运算符而不是 `>=` 以使答案更直观。 (2认同)
  • 现在的答案在语义上不是错误的吗?正如@Aaron Plocharczyk所描述的,0.5不应该属于上半部分的概率吗?0.0 属于 Math-random() 的下半部分,1.0 不在 [0,1) 范围内。所以请将`<=`改为`<`。 (2认同)

Nis*_*hth 20

如果您的项目有,lodash那么您可以:

_.sample([true, false])
Run Code Online (Sandbox Code Playgroud)


Ale*_*ara 12

要获得更加加密的安全值,您可以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;
Run Code Online (Sandbox Code Playgroud)

请注意,该crypto对象是一个DOM API,因此它在Node中不可用,但Node 也有类似的API.

  • `Math.random()`在很多方面都是非常随意的,很好的替代建议 (4认同)
  • 我只是要在这里添加一个小的修正,因为我发现它经过5000万次运行后平均产生0.78%左右更多的零:返回a [0] <= 127; (其他127不包括在内) (3认同)
  • @AmundMidtskog好的电话.我应该打字:`a [0]> 127` (2认同)

小智 10

!Math.round(Math.random());
Run Code Online (Sandbox Code Playgroud)

­­­­­­­­­­­­­­

  • 请更有效地格式化它(https://stackoverflow.com/editing-help)并添加一些解释。仅代码答案不太受欢迎。添加解释将有助于消除 StackOverflow 是免费代码编写服务的误解。 (9认同)

Art*_*zbs 8

开尔文的回答给我留下了深刻的印象,我想建议一个相当相似但稍微增强的解决方案。

var randomBoolean = Math.random() < 0.5;
Run Code Online (Sandbox Code Playgroud)

这个解决方案读起来更明显一点,因为右边的数字<告诉你得到true而不是得到的概率false,这更容易理解。也<>=;短一个符号