问题很简单,但我对其中的细微差别很感兴趣。

我用我自己想出的方法生成随机布尔值:

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

每当random()出现时,似乎总是有一个陷阱——它不是真正的随机,它受到了某些东西的损害,等等。所以,我想知道:

a)以上是最好的做法吗?

b)我是不是想太多了?

c)我是否考虑不足?

d)还有更好/更快/更优雅的方式吗?

(如果B和C是互斥的也有点感兴趣。)

更新

如果有影响的话,我会将其用于AI角色的移动。


您可以直接比较Math.random()和0.5,因为Math.random()的范围是[0,1)(这意味着'在0到1的范围内,包括0,但不包括1')。您可以将范围分为[0,0.5)和[0.5,1)。

var random_boolean = Math.random() < 0.5;

/ /实例 console.log(Math.random() < 0.1);//10%的概率为真 console.log(Math.random() < 0.4);//40%的概率为真 console.log(Math.random() < 0.5);//50%的概率为真 console.log(Math.random() < 0.8);//80%的概率为真 console.log(Math.random() < 0.9);//90%的概率为真


要获得更安全的加密值,可以使用crypto。现代浏览器中的getRandomValues。

示例:

var randomBool =(功能)( var a =新Uint8Array(1); 返回功能() crypto getRandomValues (a); 返回到[0]> 127; ); (1); var trues = 0; var falses = 0; for (var i = 0;i < 255;i + +) ( 如果(randomBool()) ( trues +; ) else ( falses +; ) ) 文件。身体。

请注意,加密对象是一个DOM API,所以在Node中不可用,但Node有一个类似的API。


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

_.sample([true, false])

或者你也可以使用你自己的示例函数(来源):

const sample = arr => arr[Math.floor(Math.random() * arr.length)];

这个怎么样?

return Math.round((Math.random() * 1) + 0) === 0;

!Math.round(Math.random());

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


开尔文的回答给我留下了深刻的印象,我想提出一个相当相似但略有增强的解决方案。

var randomBoolean = Math.random() < 0.5;

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


潜在的更快的解决方案……

位算子方法我只是想到Math.random() + .5 >> 0或~~(Math.random() + .5)。这里有一个性能测试供您自己判断。

let randomBoolean = Math.random() + .5 >> 0;                 //chance of true
const randomBoolean = chance => Math.random() + chance >> 0; //chance of true

在这种情况下,按位操作符本质上与使用Math.trunc()或Math.floor()相同,因此这也是可能的Math.trunc(Math.random() + .5)。

let randomBoolean = Math.trunc(Math.random() + .5);
const randomBoolean = chance => Math.trunc(Math.random() + chance);

其他更常见的解决方案

更常见的获取随机布尔值的方法可能是比较方法,比如Math.random() >= .5 from Kelvin's answer或Math.random() < .5;从Arthur Khazbs的答案中,它们实际上输出的是真和假,而不是1和0。

let randomBoolean = Math.random() >= .5;                 //chance of false
const randomBoolean = chance => Math.random() >= chance; //chance of false

let randomBoolean = Math.random()  < .5;                 //chance of true
const randomBoolean = chance => Math.random() < chance;  //chance of true

使用Math.round(Math.random())方法的唯一原因是简单和懒惰。


让我们尝试最简单的解决方案

让状态= Math.round (math . random ()) console.log(状态) 如果(状态= = 1) { 状态= true 其他}{ 状态= false } console.log(状态)


有时我只是需要一个“随机”布尔值来作为教学示例或其他东西。根据您的用例,这可能是随机的。

函数flipCoin() { 返回Boolean(Date.now() % 2); } console.log(flipCoin());