Получить случайное число с упором на ограничения (кривая параболы) - PullRequest
0 голосов
/ 24 сентября 2018

Мои математические знания могут быть ограничены, чтобы решить это самостоятельно.Я нашел похожий вопрос , однако, с фокусом на центре, а не на границах.

Я хотел бы создать случайные числа с max и min, но с фокусом на max и min,так что числа ближе к максимальным и минимальным значениям должны появляться чаще, чем те, которые находятся между ними.

Я помню, что в математике есть функция для создания кривой параболы: enter image description here

И с помощью этого онлайн-инструмента я сгенерировал нужную мне функцию, которая должна выглядеть примерно так:

y = 0,05 * x ^ 2

Это моя основная идея, и, пытаясь превратить ее в javascript, я закончил с этим:

for (let i = 0; i < 100; i++) {
  // Create random x with ^ 2 with max=100 and min=0
  let x = Math.pow(Math.floor(Math.random() * (100 - 0 + 1)) + 0, 2);
  // log the random number in the console
  console.log(0.05 * x);
}

Но, конечно, это не имеет никакого реального смысла, как я также вижу в консоли(Я заказал их, чтобы было понятнее)

> 0 0
> 0.05
> 0.05
> 0.2
> 0.2
> 0.8
> 2.45
> 3.2
> 3.2
> 3.2
> 4.05
> 4.05
> 4.05
> 6.05
> 8.45
> 8.45
> 14.45
> 16.2
> 16.2
> 16.2 20 20
> 22.05
> 22.05
> 22.05
> 26.45
> 28.8
> 28.8
> 31.25
> 33.8
> 36.45
> 39.2
> 42.05
> 48.05
> 48.05
> 48.05
> 51.2
> 57.8
> 57.8
> 57.8
> 64.8
> 64.8
> 64.8
> 68.45
> 76.05
> 88.2
> 88.2
> 92.45
> 92.45
> 92.45
> 96.8
> 101.25
> 105.8
> 110.45 125
> 130.05
> 130.05
> 135.2
> 140.45
> 140.45
> 145.8
> 145.8
> 145.8
> 156.8
> 162.45
> 162.45
> 162.45 180 180
> 198.45
> 204.8
> 204.8
> 224.45
> 231.2
> 231.2
> 231.2
> 231.2
> 238.05
> 238.05
> 259.2 320 320
> 328.05
> 344.45
> 352.8
> 352.8
> 361.25
> 369.8
> 387.2
> 387.2
> 423.2
> 423.2
> 432.45
> 451.25
> 460.8
> 470.45
> 470.45
> 490.05
> 490.05

Кто-нибудь, у кого, возможно, есть идея?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Eventough @MBo отклонил мое редактирование (но имеет правильный ответ), я все еще собираюсь поделиться рабочим примером, основанным на переменной min и max (только положительные числа)

const max = 200;
for (let i = 0; i < 20; i++) {

const min = 40;
const focus = 0.4; // 0 - 1, the lower the more focus on limitations

let numbs = [];

//The core function
function randomFocusBorders(max, min) {
  const middle = (max - min) / 2;
  let x = Math.floor(50 * (Math.pow(Math.Random(), 0.5));

  let x = Math.floor(middle * Math.pow(Math.random(), focus));
  if (Math.Random() < 0.5) 

  if (Math.random() < 0.5) x = middle - x;
      x = 50 - x

  else x = middle + x;
  x += min;
  return x;

}
  else



//Call it 100 times and add value to numbs array
      x = 50 + x;

for (let i = 0; i < 100; i++) {
  numbs.push(randomFocusBorders(max, min));

}



//Sort numbs array ascending
   ...

numbs.sort((a, b) => {
  return a > b ? 1 : -1;
}

});


console.log(numbs);

Working jsFiddle

0 голосов
/ 24 сентября 2018

Чтобы генерировать случайные числа с необходимым распределением, можно использовать преобразование Смирнова ( обратная выборка ).

Чтобы получить параболическое распределение, просто используйте равномерный генератор случайных чисел для диапазона 0..1 и применитеквадратный корень.Пример должен генерировать значения в диапазоне 0..100 с большей плотностью вблизи концов.

for (let i = 0; i < 20; i++) {
  let x = Math.floor(50 * (Math.pow(Math.Random(), 0.5));
  if (Math.Random() < 0.5) 
      x = 50 - x
  else
      x = 50 + x;
   ...
}
...