Выбор случайного элемента из массива с вероятностью

128
22 декабря 2019, 18:50

Можно выбрать случайное значение из массива с помощью кода:

config.targets[Math.floor(Math.random() * config.targets.length)]

А можно ли сделать так, чтобы в 75% случаев выбирались первые 10% содержимого массива?

Например, есть массив с числами от 1 до 100. Нужно, чтобы 75% рандома выпало на числа от 1 до 10.

Answer 1

Если нужно обеспечить минимум 75% вероятности того, что случайно выбранные элементы окажутся в первой 1/10 части массива:

let max = config.targets.length; 
if (Math.random() < 0.75)                   // с вероятностью 75%... 
  max /= 10;                                // ...сокращаем диапазон до 10% от кол-ва элементов
let idx = Math.floor(Math.random() * max);  // это результат, "случайный" индекс элемента

"Обеспечить" - это условно... На практике, в некотрых случаях может получиться немного меньше (величина отклонения зависит от кол-ва элементов, в первую очередь).

const config = { targets: new Array(100) };  
let max = config.targets.length;  
for (let i = 0; i < max; i++) 
  config.targets[i] = i + 1;  
 
const rndTarget = () => { 
  let cMax = Math.random() >= 0.75 ? max : max * 0.1;  
  return config.targets[Math.floor(Math.random() * cMax)];  
};  
const testVol = 250; 
for (var test = [], i = 0; i < testVol; i++)  
  test.push(rndTarget());  
const tenPercentCount = test.reduce((r, v) => r += v <= 10, 0);  
console.log(`Из ${testVol} случайно выбранных элементов, ${(tenPercentCount / testVol * 100).toFixed(1)}% в первой 1/10 части массива.\nЧисла:\n${test.join(', ')}`); 

Answer 2

Число запросов поделите пропорционально и в 75% случаев выборку меняйте на нужные 10% )

PS Ну вот так еще можно:

random = Math.round( Math.random() * 100);
if ( random >= 0 && random <= 75 ) Math.round( Math.random() * 10);
else if ( random > 75 && random <= 100 ) Math.round( Math.random() * 90 + 10);
Answer 3

const f = (n, m, p) => () => Math.floor (Math.random () * (Math.random () < p ? m : n)) 
 
console.log (Array.from ({length: 100}, f (100, 10, 0.75)))

READ ALSO
Как обрезать путь к файлу через regex?

Как обрезать путь к файлу через regex?

Как можно получить только имя файла или папки через regex ? Например у меня есть такой путь:

114
Динамический запрос MySql

Динамический запрос MySql

Нужно передать в функцию mySql и выполнить содержимое функции:

143
двойная сортировка MySQL относительно 0

двойная сортировка MySQL относительно 0

Помогите пожалуйста сформировать запросЕсть выборка из 2х таблиц:

135