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. перебрать все 2^51 комбинации состояний
  2. Для каждой комбинации c, его объединенные голоса выборщиков больше или равно 270, добавить его в коллекцию C из собраний штатов
  3. Для кандидата от республиканцев суммируйте вероятности выигрыша каждой комбинации состояний в C; позвоните этому значению r. Это его шансы на победу. Шанс демократа - 1 - r.

Но так как я не могу пройти через все 2^51, что я делаю это выбор некоторых N меньше 51 и делать

  1. Найти случайные 2^N комбинации состояний которых объединенные голоса выборщиков сумма равна или равна 270; назовите эту комбинацию C.
  2. Для кандидата от республиканцев суммируйте вероятности выигрыша каждой комбинации состояний в C; позвоните этому значению r. Multiply r by 2^(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 состояния, вы были бы за пределами безопасного целочисленного диапазона. Некоторые реализации могут дать вам еще меньше бит случайности (он сломался для меня в узле, который дает только 32 бита). Таким образом, я предлагаю добавить функцию

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 rand = Math.floor(Math.random() * Math.pow(2,states.length)); 

с const rand = getRandom() + getRandom(); и заменить getCombo с

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

(2) Вы должны рассчитывать обе победы и потери для республиканской партии чтобы оценить вероятность. Таким образом, вы не можете добавить дополнение к комбо (кстати, ~ - поразрядные операции, следовательно, преобразование операнда в 32-битное целое, поэтому ваш код не работает так, как предполагалось). Поэтому ваш код должен быть упрощена:

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

(3) Вы должны масштабировать repubChanceSum по N/n, где N = Math.pow(2, 51) и n = limit. Обратите внимание, что limit должно быть значительно больше winningCombos.length.

С этими изменениями код правильно прогнозирует вероятность ~50%. См. Это измененное fiddle. Будем надеяться, что мы получим более оптимистичный прогноз на будущее с более реалистичными вероятностями.

Смежные вопросы