javascript-随机播放JS数组
作者:互联网
说我有一个像这样的数组:
const alphabet = ['a', 'b', 'c', 'd'];
这代表4个政治候选人和一个等级选择投票,其中候选人a是第一选择,候选人b是第二选择,依此类推.
我想将其随机排列成一堆随机顺序,但是在这种情况下,我希望a以大约60%的价格出现在第一位,b以20%的概率出现在第二位,而c以10%的概率出现在第三位,所有其他的出现可能是10位. %.是否有一些lodash和ramda功能可以完成此任务?
这用于测试等级选择投票算法.随机地对数组进行改组产生的候选人具有几乎完全相同的投票计数,这与大多数现实情况不符(尽管我也会对此进行测试).
我有一个非常可怕的例程,它将生成一个随机数组:
const getValues = function () {
const results = [];
const remaining = new Set(alphabet);
const probabilities = [0.6, 0.2, 0.1, 0.1];
for(let i = 0; i < alphabet.length; i++){
const r = Math.random();
const letter = alphabet[i];
if(r < probabilities[i] && remaining.has(letter)){
results.push(letter);
remaining.delete(letter);
}
else{
const rand = Math.floor(Math.random()*remaining.size);
const x = Array.from(remaining)[rand];
remaining.delete(x);
results.push(x);
}
}
return results;
};
这种“有效”的方法,但是由于条件概率的原因,并不能完全按照指定的概率对事物进行排序.如上所述,有人知道让订单以一定概率出现的好方法吗?
这是我正在寻找的一些示例输出:
[ [ 'd', 'b', 'a', 'c' ],
[ 'a', 'b', 'c', 'd' ],
[ 'a', 'd', 'b', 'c' ],
[ 'd', 'b', 'a', 'c' ],
[ 'b', 'c', 'a', 'd' ],
[ 'a', 'b', 'c', 'd' ],
[ 'd', 'b', 'c', 'a' ],
[ 'c', 'd', 'a', 'b' ],
[ 'd', 'b', 'a', 'c' ],
[ 'a', 'b', 'c', 'd' ] ]
如果您生成了足够的数据,将不符合所需的订单/分布.
解决方法:
您可以使用如下所示的随机播放功能对它们进行排序:
const candidates = [
{ name: "a", weight: 6 },
{ name: "b", weight: 2 },
{ name: "c", weight: 1 },
{ name: "d", weight: 1 }
];
const randomShuffleFn = () => Math.random() - .5;
const shuffleFn = (candidateA, candidateB) =>
Math.random() * (candidateB.weight + candidateA.weight) - candidateA.weight;
console.log([...candidates].sort(randomShuffleFn).sort(shuffleFn));
好的,这并不完全相同,但是我认为通过调整权重可以得到所需的分布(就这样,A赢得60%的次数).
标签:voting-system,voting,data-science,javascript,algorithm 来源: https://codeday.me/bug/20191024/1922726.html