0

私がやろうとしていることを説明しましょう。私は私の論理は、大統領の結果を計算しようとして間違っていますか?

const dataByState = { 
    'Washington' : { ElectoralVotes : 12, RChance: 54, DChance: 46 }, 
    'Oregon': { ElectoralVotes: 7, RChance: 51, DChance: 49 }, 
    . 
    . 
    . 
    'Hawaii' : { ElectoralVotes: 4, RChance : 40, DChance: 60 } 
}; 

'Hawaii' : { ElectoralVotes: 4, RChance : 40, DChance: 60 } 

ような上記のキーと値のペアの一方は4回の選挙投票を有する状態ハワイにおいて、」を意味

ようなデータを持っている、40%の確率があります共和党候補が勝利し、勝利した民主党候補者の60%のチャンス "。私が最終的にしようとしているのは、各候補者が選挙に勝つチャンスを計算することです。これは完璧な世界で行われるだろうか

  1. 反復がそれぞれの組み合わせcに対して
  2. 状態の全て2^51組み合わせている場合、その組み合わせ選挙の投票は、270以上であるコレクションCのに追加します州の集団
  3. 共和国候補については、それぞれの州の組み合わせを獲得する確率を合計してCとします。その値をrと呼んでください。それが彼/彼女の勝利のチャンスです。民主党のチャンスは1 - rです。

しかし、私はすべての2^51通過することができないので、私がやっていることは、いくつかのN51よりも小さいと

  1. 組み合わせ選挙の投票状態のランダム2^N組み合わせを探すをやって選んでいます270以上の合計。この組み合わせをCと呼んでください。
  2. 共和党候補の場合は、それぞれの州の組み合わせを獲得する確率を合計してCとします。その値をrと呼んでください。 r2^(51-N)で掛けます。それはおおよそ勝つチャンスです。民主党のチャンスは1 - rです。

これはうまくいきません。私のロジックが間違っている(私は大学3年前から統計を取っていません)か、丸め誤差に陥っているかどうかは疑問です。すべての州でもチャンスを作ったとき、私は共和党の勝利のほぼ100%を獲得しています(つまり、アメリカは再び偉大になりました)。それは、約50/50に計算する必要があるため間違っています。

コードダンプ:あなたは全体の合計を計算することは不可能である観察したようhttps://jsfiddle.net/pqhnwek9/

+0

州の「組み合わせ」とはどういう意味ですか? –

+0

@AbhishekBansal私はサブセットを意味する – user6048670

答えて

0

共和党の勝利の確率は

probRepVict = 0 
for(combination in combinations) { 
    if(combination is republican victory) { 
     probRepVict += proability of combination 
    } 
} 

です。したがって、この確率を推定するために、サブセットCを選択します。最後の文で

N = number of combination // 2^51 
n = size of C 
probRepVictEstimate = 0 
for(combination in C) { 
    if(combination is republican victory) { 
     probRepVictEstimate += proability of combination 
    } 
} 

probRepVictEstimate *= N/n 

我々は勝利の確率はサブセットの大きさと直線的に拡張することを前提としています。ランダム性の

乱数を生成する場合(1)あなたが得られない可能性があります十分に多くのビット:

私はロジックは、スクリプト内のいくつかの場所でうまくいかないと信じています。たとえば、54の状態があった場合、あなたは安全な整数の範囲外になります。いくつかの実装では、乱数のビット数をさらに少なくすることができます(Nodeでは32ビットしか与えません)。したがって、私はconst rand = getRandom() + getRandom();

const rand = Math.floor(Math.random() * Math.pow(2,states.length)); 

の交換機能

function getRandom() { 
    // Generate 32 random bits             
    var s = Math.floor(Math.random()*Math.pow(2, 32)).toString(2) 
    return new Array(32 - s.length + 1).join("0") + s 
} 

を追加することを提案し、

const getCombo = (i) => { 
    let combo = []; 
    for(var j = 0; j < states.length; ++j) 
     if(i[j] == "0") 
      combo.push(states[j]); 
    return combo; 
} 

getComboを交換する(2)あなたは共和党のための勝敗の両方をカウントする必要があります確率を推定することができる。したがって、コンボの補数を追加することはできません(ちなみに、~はビット単位の演算であるため、オペランドを32ビット整数に変換してコードが意図した通りに動作しません)。

... 
if(!winningCombos.hasOwnProperty(rand)) { 
    const stateCombo = getCombo(rand); 
    if(hasSufficientVotes(stateCombo)) 
    { 
     winningCombos[rand] = stateCombo; 
     ++wins; 
    } 
    ++count; 
} 
... 

(3)あなたはどこN = Math.pow(2, 51)n = limitN/nによってrepubChanceSumをスケーリングする必要があります。したがって、あなたのコードは、のように簡略化されなければなりません。 limitwinningCombos.lengthよりかなり大きいはずです。

これらの変更を行うと、コードで正しく~50%の確率が予測されます。これは変更されたfiddleを参照してください。 より現実的な確率で将来の楽観的な見通しを得ることを望みましょう。

関連する問題