2010-09-05 103 views
5

我想在JavaScript中創建一個隨機布爾值,但我想考慮前面的值。如果以前的值是真的,我希望它更可能是下一個值爲真。目前,我有這個(這是一個封閉的環境 - goUplastGoUp是當地人包含範圍內):優化隨機布爾值的方法

function setGoUp() { 
    goUp = getRandomBoolean(); 

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

所以,算法變爲:

  1. 得到一個隨機布爾
  2. 如果從以前的電話隨機布爾是真實的:

    一)得到另一個隨機布爾和or這兩個一起

    b)else獲得另一個隨機布爾值和and這些在一起。

我相信這個算法可以簡化。我想知道如何做:

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

但這似乎真的很髒。

這個算法也有問題,這意味着我只能再次獲得相同布爾值的機會 - 我無法輕鬆調整它。有任何想法嗎?

回答

11

你應該定義你想要的發行版,但也許你正在尋找以下內容?

if (lastGoUp) { 
    goUp = Math.random() < 0.8; 
} else { 
    goUp = Math.random() < 0.2; 
} 
+0

當然!我並沒有以任何偏見開始,所以我試圖找出如何偏好已有的布爾值。謝謝:) – Skilldrick 2010-09-05 12:22:53

+1

順便說一句,我決定去'< 0.8' and '> 0.8'因爲這對我來說更有意義。把0.8變成一個命名常量也是更清楚的。 – Skilldrick 2010-09-05 12:53:21

+0

'GetRandomFloatBetween0And1'(也就是''0,1''的區間)就是'Math.random()'的作用。 – 2017-07-30 14:40:11

0

我只是讓獲取值的概率true是一個明確的float變量p。然後我可以很容易地調整它,如果我上次得到true,或者如果我得到'假',那麼我可以通過以某種方式增加p

4

非但沒有隨機布爾的,得到一個隨機數,0到99之間說保持的閾值,而不是最後一個號碼,並調整閾值根據結果:

var threshold = 50; 

function setGoUp() { 
    goUp = getRandomNumber() < threshold; 
    threshold += goUp ? -10 : 10; 
} 

這會保持一個正在運行的選項卡,所以如果連續得到的結果是相同的,那麼結果的可能性會持續下降。

如果你只是要考慮最後的結果,你會代替門檻設置爲特定值:

threshold = goUp ? 40 : 60; 
+0

謝謝。如果我需要考慮多個結果,我一定會記住這一點。 – Skilldrick 2010-09-05 12:26:30

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 = false。

2

如果您只希望下一個事件的概率取決於當前值,而不是現在直到現在的值的歷史記錄,那麼您想要的稱爲馬爾可夫過程。通常這些都是用你查找的二維概率表來實現的(每個下一個結果在給定當前結果的概率下),但是對於一個簡單的布爾值事件,if語句就足夠了(請參閱meriton的答案;注意它對應於概率表[0.8 0.2; 0.2 0.8])。

如果你想要更有可能的事情,也就是說,你連續獲得的成功越多,那麼你需要設計一系列成功的概率,可能接近但不超過1。的公式可以做到這一點,這取決於你希望自己的偏見變得多強,以及你希望它到達那裏的速度。

+0

舊的解決方案確實奏效,因爲我每次都會生成兩個隨機布爾值。如果'lastGoUp'爲'true',那麼我或者兩個布爾值在一起(1的4次機會也是正確的),並且如果'lastGoUp'是'false',那麼我將兩個布爾值放在一起(1in 4的機會也是錯誤的)。這是一個相當凌亂的算法,但。 – Skilldrick 2010-09-05 13:01:35

+0

啊,我明白了,你是對的 - 這實際上是在做類似[.75 .25; .25 .75]。我刪除了我的說法,那是行不通的。 – 2010-09-05 14:30:52

+0

沒問題。就像我說的那樣,這不是最乾淨的代碼! – Skilldrick 2010-09-05 18:29:19