2015-04-23 3 views
0

Я разрабатываю Node.js приложение, где победитель должен быть выбран случайным образом на его основе Вероятность выигрыша в диапазоне [0, 100]%Weighted Random номер выбора

Мой код выглядит следующим образом:

var activeGame = { 
    id: 12324, 
    type: 1, 
    active: true, 
    players: [{ 
     id: 5032, 
     name: "Username", 
     foo: true, 
     winProbability: 56.32 //% 
    }, { 
     id: 98243, 
     name: "Username", 
     foo: true, 
     winProbability: 22.68 //% 
    }, { 
     id: 10943, 
     name: "Username", 
     foo: false, 
     winProbability: 21.00 //% 
    }], 
}; 

Я нашел другие алгоритмы, которые были не очень ясными и не работали с вероятностями, добавляющими до 100%.

Я ищу способ создать function selectRandomWinner() для возвращения индекса выигравшего игрока, но я застрял, и все, и любая помощь будет принята с благодарностью. Благодаря!

+0

генерации одного случайное число 0..100. Сравните его с номером первого игрока. Меньше? Он побеждает. Если больше, сравните с SUM номера первого и второго игроков. Еще больше? Затем добавьте номер третьего игрока ... и т. Д. Короче говоря, просто сравните свой выбор с суммарной суммой чисел от игроков, когда вы спускаетесь. Последний игрок вызовет сумму в 100, поэтому он победит, когда все остальные потерпят неудачу (и правильная сумма). –

ответ

4

Вычислить случайное число от 0 до 100. Затем цикл через игроков добавляя их вероятности в общей сложности, пока общее не выше, чем случайное число:

var activeGame = { 
 
    id: 12324, 
 
    type: 1, 
 
    active: true, 
 
    players: [{ 
 
    id: 5032, 
 
    name: "Joe", 
 
    foo: true, 
 
    winProbability: 56.32 //% 
 
    }, { 
 
    id: 98243, 
 
    name: "Jane", 
 
    foo: true, 
 
    winProbability: 22.68 //% 
 
    }, { 
 
    id: 10943, 
 
    name: "Fred", 
 
    foo: false, 
 
    winProbability: 21.00 //% 
 
    }], 
 
}; 
 

 
function pickPlayer() { 
 
    var randPct = Math.random() * 100; 
 
    var total = 0; 
 
    var players = activeGame.players; 
 
    var selectedPlayer; 
 
    for (var i = 0; i < players.length; i++) { 
 
    total += players[i].winProbability; 
 
    if (randPct < total) { 
 
     selectedPlayer = players[i]; 
 
     break; 
 
    } 
 
    } 
 
    return selectedPlayer; 
 
} 
 

 
var results = document.getElementById("results"); 
 
var resultObj = {}; 
 
for (var i = 0; i < 1000; i++) { 
 
    var playerName = pickPlayer().name; 
 
    if (resultObj[playerName]) { 
 
    resultObj[playerName] ++; 
 
    } else { 
 
    resultObj[playerName] = 1; 
 
    } 
 
} 
 
for (name in resultObj) { 
 
    results.innerHTML += "<tr><td>" + name + "</td><td>" + resultObj[name] + "</td></tr>"; 
 
}
Results of picking 1000 players: 
 
<table id="results"> 
 
    <tr> 
 
    <th>Name</th> 
 
    <th>Count</th> 
 
</table>

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