假设我有一个像这样的数组:
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' ] ]
如果您生成了足够的数据,它将不符合所需的顺序/分布。