Вероятность выборки между двумя элементами массива JS
Если примерно такой код :
var name=['Red','Green'];
var vr=50; // вероятность выбора между элементами массива
Если vr=50, нужно получить :
Red
Green
Red
Green
Если vr=25, нужно получить примерно такое :
Red
Green
Green
Green
Если vr=75, нужно получить, примерно такое :
Green
Green
Green
Red
Как правильно такое сделать?
Ответы (2 шт):
Автор решения: Zhihar
→ Ссылка
если случайно выбрать, то есть же простой метод
получаете число от
0до1если число больше
p, то выбираете один элемент иначе другой
код:
const name=['Red','Green'];
const p_limit = 0.75
arr = Array()
for (i = 0; i < 100; i++) {
const p = Math.random();
arr.push(p > p_limit ? name[0] : name[1]);
}
Автор решения: DiD
→ Ссылка
// Функция выбирает псевдо-рандомный вариант из массива variants
// c перевесами в массиве possibility
const getRandomVariant = (variants, possibility) =>
variants[possibility.map((v,k) => new Array(v).fill(k)).flat()
[Math.trunc(Math.random()*possibility.reduce((s,p)=>s+p,0))]];
// Функция выбирает серию длиной count псевдо-рандомных вариантов, которые
// берутся из массива variants c перевесами в массиве possibility
const getSeries = (variants, possibility, count) =>
new Array(count).fill('').map(() =>
getRandomVariant(variants, possibility))
.join(' ');
// Два варианта, перевес на вариант с индексом [0] = 4:1
console.log( getSeries(['a','b'],[4,1],100) );
// Два варианта, перевес на вариант с индексом [1] = 1:4
console.log( getSeries(['a','b'],[1,4],100) );
// Три варианта перевес соответствует соотношению 1:2:3
console.log( getSeries(['a','b','c'],[1,2,3],100) );
// Три варианта перевес соответствует соотношению 5:1:5
console.log( getSeries(['a','b','c'],[5,1,5],100) );
// Три варианта перевес соответствует соотношению 5:100:5
console.log( getSeries(['a','b','c'],[5,100,5],100) );