Скажем, у меня есть такой массив:
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' ] ]
, если вы сгенерировалидостаточно данных, которые не соответствуют желаемому заказу / распределению.