如果你想保证你的操作发生在一个确切的时间百分比(而不是让机会发生),但你希望它们以随机顺序被选择,那么你可以做这样的事情,你创建一个数据结构在所有元素的一次迭代中,您想要的确切结果。然后,您随机选择其中一个结果,将其从数据结构中删除,随机选择另一个结果等等......
如果您使用每个结果的适当百分比为初始数据结构播种,那么您将根据该规则获得结果,并且对于每次完整迭代,您将获得每个结果的准确数量,但它们将以随机顺序选择并且每次的顺序都会不同。
如果您希望该过程一遍又一遍地重复,您可以在每次完成一个完整的迭代时重新开始它。
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/
如果您运行该演示,您将看到每次运行都会准确生成每个结果的所需数量,但它们是按随机顺序选择的。