操作が(偶然に任せるのではなく)正確な割合で行われることを保証したいが、それらをランダムな順序で選択したい場合は、データ構造を作成する場所でこのようなことを行うことができますすべての要素の 1 回の反復で必要な正確な結果。次に、それらの結果の 1 つをランダムに選択し、それをデータ構造から削除し、別の結果をランダムに選択します...
各結果の適切なパーセンテージで初期データ構造をシードすると、そのルールに従って結果が得られ、完全な反復ごとに、各結果の正確な数が得られますが、それらはランダムな順序で選択されますその順序は毎回異なります。
プロセスを何度も繰り返したい場合は、完全な反復が 1 回完了するたびにプロセスをやり直すことができます。
var playProbabilities = [
{item: "A", chances: 3},
{item: "B", chances: 2},
{item: "C", chances: 1},
{item: "D", chances: 2},
{item: "E", chances: 1},
{item: "F", chances: 1}
];
function startPlay(items) {
var itemsRemaining = [];
// cycle through the items list and populate itemsRemaining
for (var i = 0; i < items.length; i++) {
var obj = items[i];
// for each item, start with the right number of chances
for (var j = 0; j < obj.chances; j++) {
itemsRemaining.push(obj.item);
}
}
return(itemsRemaining);
}
function nextPlay(itemsRemaining) {
if (!itemsRemaining.length) {
return null;
}
// randomly pick one
var rand = Math.floor(Math.random() * itemsRemaining.length);
var result = itemsRemaining[rand];
// remove the one we picked from the array
itemsRemaining.splice(rand, 1);
return(result);
}
$("#go").click(function() {
var results = $("#results");
var items = startPlay(playProbabilities);
var next;
while(next = nextPlay(items)) {
results.append(next + "<br>");
}
results.append("-------------<br>");
});
ここでの動作デモ: http://jsfiddle.net/jfriend00/x2v63/
デモを実行すると、実行ごとに、各結果の正確な数が生成されることがわかりますが、それらはランダムな順序で選択されます。