我想在JavaScript中创建一个随机布尔值,但我想考虑以前的值。如果前一个值为true,我希望下一个值更有可能为真。目前我已经得到了这个(这是在关闭的上下文中 - goUp
和lastGoUp
是包含范围的本地人):
function setGoUp() {
goUp = getRandomBoolean();
if(lastGoUp) {
goUp = getRandomBoolean() || goUp;
}
else {
goUp = getRandomBoolean() && goUp;
}
lastGoUp = goUp;
}
所以,算法是:
如果前一次调用的随机布尔值为True:
a)获得另一个随机布尔值,并将or
这两个放在一起
b)否则获得另一个随机布尔值和and
这些。
我确信这个算法可以简化。我想知道:
if(lastGoUp && goUp) {
goUp = goUp * (getRandomBoolean() || goUp);
}
但这看起来很脏。
这个算法也有问题,这意味着我只能再次获得相同布尔值的机会加倍 - 我无法轻易调整它。有什么想法吗?
答案 0 :(得分:11)
您应该定义所需的发行版,但也许您正在寻找以下内容?
if (lastGoUp) {
goUp = Math.random() < 0.8;
} else {
goUp = Math.random() < 0.2;
}
答案 1 :(得分:4)
不是获取随机布尔值,而是获取一个随机数,例如0到99之间。保留一个阈值而不是最后一个数字,并根据结果调整阈值:
var threshold = 50;
function setGoUp() {
goUp = getRandomNumber() < threshold;
threshold += goUp ? -10 : 10;
}
这将保持一个正在运行的选项卡,因此如果您获得相同的连续结果,则该结果的概率将继续下降。
如果您只想考虑最后的结果,则应将阈值设置为特定值:
threshold = goUp ? 40 : 60;
答案 2 :(得分:2)
如果您只希望下一个事件的概率取决于当前值,而不是现在的值的历史记录,那么您想要的是马尔可夫过程。通常这些是通过你查找的2D概率表(给定当前的每个下一个结果的概率)实现的,但是对于一个简单的bool值事件,if语句就足够了(请参阅meriton的答案;请注意它对应于概率表[0.8 0.2; 0.2 0.8])。
如果你想要的东西越来越有可能,比如你连续获得的成功越多,那么你需要设计一系列成功的概率,这些概率可能接近但不超过1。有任何数量的可以做到这一点的公式,取决于你想要偏见的强度以及你希望它到达那里的速度。
答案 3 :(得分:0)
我只是将获得价值true
的概率设为明确的float
变量p
。然后我可以通过以某种方式增加p
,如果我上次获得true
,或者如果我得到'假'则不做任何事情,我可以轻松调整它。
答案 4 :(得分:0)
可以替换Math.random以获得更好的随机函数。
var setGoUp = (function(){
var last;
return function(){
// if last 66% chance for true else 50% chance of true.
return !!(last ? Math.random()*3 : Math.random()*2);
}
}());
!!将任何东西转换为布尔值,0 =假。