优雅的方式来偏向随机布尔值

时间:2010-09-05 11:56:12

标签: javascript algorithm random boolean

我想在JavaScript中创建一个随机布尔值,但我想考虑以前的值。如果前一个值为true,我希望下一个值更有可能为真。目前我已经得到了这个(这是在关闭的上下文中 - goUplastGoUp是包含范围的本地人):

function setGoUp() {
    goUp = getRandomBoolean();

    if(lastGoUp) {
        goUp = getRandomBoolean() || goUp;
    }
    else {
        goUp = getRandomBoolean() && goUp;
    }
    lastGoUp = goUp;
}

所以,算法是:

  1. 获取随机布尔值
  2. 如果前一次调用的随机布尔值为True:

    a)获得另一个随机布尔值,并将or这两个放在一起

    b)否则获得另一个随机布尔值和and这些。

  3. 我确信这个算法可以简化。我想知道:

    if(lastGoUp && goUp) {
        goUp = goUp * (getRandomBoolean() || goUp);
    }
    

    但这看起来很脏。

    这个算法也有问题,这意味着我只能再次获得相同布尔值的机会加倍 - 我无法轻易调整它。有什么想法吗?

5 个答案:

答案 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 =假。