Алгоритм, который случайным образом выводит большие числа из массива
Aug 19 2020
Я провел исследование и нашел алгоритм для небольших списков в целом. У меня есть такие массивы:
arr = [1,2,3,4 .... , 96,97,98,99,100];
arr2 = [105, 110, 165, 170];
arr3 = [1,2,7,8,9];
Я хочу отправить эти массивы в функцию и получить случайные числа из этого массива, но я хочу иметь более высокую вероятность получения больших чисел каждый раз.
Например, в массиве 1 вероятность 96 должна быть больше 4, но вероятность 97 должна быть больше 96.
Как сгенерировать случайное взвешенное распределение элементов
Обычно решения как в этой теме. Однако это может вызвать проблемы с производительностью моих массивов.
Как я могу этого добиться?
Ответы
2 NinaScholz Aug 19 2020 at 15:29
Вы можете рассчитать вероятности и выбрать значение.
Для использования с настраиваемым массивом возьмите random
getRandomValue = random(sortedArray),
а позже в цикле
let value = getRandomValue();
const
random = sortedValues => {
let length = sortedValues.length,
sum = length * (length + 1) / 2;
return () => {
let r = Math.random();
return sortedValues.find((_, i) => (r -= (i + 1) / sum) <= 0);
};
},
getRandomValue = random([6, 7, 8, 9, 10]),
counts = {};
for (let i = 0; i < 1e6; i++) {
let value = getRandomValue();
counts[value] = (counts[value] || 0) + 1;
}
console.log(counts);
.as-console-wrapper { max-height: 100% !important; top: 0; }