问题很简单,但我对这里的细微差别很感兴趣。
我使用自己想出的以下方法生成随机布尔值:
const rand = Boolean(Math.round(Math.random()));
每当random()
出现的时候,似乎总是有一个陷阱-它不是真正的随机的,它被一些或其他的东西所折衷,等等。所以,我想知道:
a)以上是最佳实践方法吗?
b)我是不是想多了?
c)我是不是想太少了?
d)有没有我不知道的更好/更快/更优雅的方法?
(如果B和C是互斥的,也会引起一些兴趣。)
更新
如果有区别的话,我会用它来移动一个AI角色。
发布于 2016-04-21 06:39:54
您可以直接比较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;
// Example
console.log(Math.random() < 0.1); //10% probability of getting true
console.log(Math.random() < 0.4); //40% probability of getting true
console.log(Math.random() < 0.5); //50% probability of getting true
console.log(Math.random() < 0.8); //80% probability of getting true
console.log(Math.random() < 0.9); //90% probability of getting true
发布于 2017-11-24 22:03:04
发布于 2016-04-21 06:47:21
为了获得更安全的密码学上的值,您可以在现代浏览器中使用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;
请注意,crypto
对象是DOM,因此它在Node中不可用,而在there is a similar API for Node中可用。
https://stackoverflow.com/questions/36756331
复制相似问题