Как мне сгенерировать случайное число, близкое к нулю? - PullRequest
1 голос
/ 03 декабря 2011

Я хочу сгенерировать число, близкое к нулю, с определенным общим диапазоном. Например, допустим, я хочу, чтобы число упало до 10 90% времени, но есть небольшая вероятность, что оно будет 15, 20 или даже 30. Чем выше число, тем ниже вероятность его получения.

Я пытался найти что-то с ключевыми словами "взвешенная вероятность", но не могу найти ничего, что ведет в правильном направлении.


Обновление:

В итоге я использовал преобразование Бокса-Мюллера (см. Принятый ответ). Вот простой код, который я написал:

const E = 2.71828183;

function getRandomCurvedValue(temp.median, temp.density) {
  return this.getCurvedValue(random(0, 1), temp.median, temp.density);
}

function getCurvedValue(temp.value, temp.median, temp.density) {
  return temp.median + (temp.density * log(E, (temp.value / (1 - temp.value)))); 
}

Ответы [ 3 ]

5 голосов
/ 03 декабря 2011

Я думаю, вы ищете нормальное распределение .

В нормальном распределении есть две переменные, которые вы можете изменить: среднее значение и стандартное отклонение. Среднее значение будет 0 в вашем случае, и стандартное отклонение будет правильно выбрано так, чтобы 90 процентов значений упали ниже 10. (На основании таблиц в статье в Википедии, я думаю, что стандартное отклонение 1.645 подходит).

Вы можете использовать преобразование Бокса-Мюллера как простой способ генерирования случайных значений с нормальным распределением из равномерно распределенных. Также вам необходимо использовать абсолютное значение результата, так как вам нужны только значения в диапазоне [0, ∞).

3 голосов
/ 03 декабря 2011

Если я вас правильно понял, вам нужны только положительные случайные числа.В этом случае вы можете использовать, например, экспоненциально распределенные случайные числа .Это распределение имеет единственный параметр, лямбда.Если вы «хотите, чтобы число упало до 10 90% времени», тогда лямбда может быть вычислена как -ln(0.1) / 10 (здесь ln - натуральный логарифм).Как правило, если вы хотите, чтобы он упал ниже x с вероятностью p, то lambda = -ln(1 - p) / x (в вашем примере p = 0,9 и x = 10).Вы можете легко генерировать экспоненциально распределенные случайные числа с заданным лямбда-параметром с помощью этой формулы: -ln(1 - rand()) / lambda, где функция rand() - это функция, которая может генерировать равномерно распределенные случайные числа от 0 до 1.

0 голосов
/ 03 декабря 2011

Одной из возможностей является создание набора случайных чисел (для каждой итерации).Минимум этих чисел выбирается в качестве вашего сгенерированного числа.

Очевидно, что чем больше чисел вы выберете, тем больше вероятность того, что у вас будет меньшее минимальное число.

Пример. Предположим, вы сгенерировали два случайных числа.числа в вашем наборе, 9 и 10. 9 выбран потому, что он самый маленький.

Скажем, вы сгенерировали четыре случайных числа в вашем наборе, 9, 10, 11 и 8. Выбрано 8, потому что оно самое маленькое.

Также с этим методом важно, чтобы у вас былодиапазон, из которого вы выбираете числа, скажем, от 1 до 100 ... (это своего рода ограничивающий фактор)

...