Несмотря на то, что вопрос довольно старый, я постараюсь ответить, потому что искал то же самое, и это может помочь следующему человеку:
Чтобы реализовать rng для произвольного распределения, вам необходимо знать следующее:
- Генерация равномерно распределенных чисел в диапазоне [0,1) не проблема
- Вывод функции распределения - это плотность распределения (например, гауссова кривая Белла)
- Функция распределения равна (более или менее) 0 в бесконечности и 1 в бесконечности. Между этими крайностями оно увеличивается монотонно.
Теперь вы должны использовать эти вещи (как минимум 1. и 3.) следующим образом:
- Рассчитать функцию распределения (с учетом плотности)
- Решите это уравнение для х
- В полученной функции передайте равномерно распределенное число в качестве параметра, чтобы получить правильно распределенные результаты.
* * 1 022 Пример: * 1 023 *
Распределение Коши:
f (x) = 1 / (x² + 1) / Pi
- Функция распределения:
y = F (x) = arctan (x) / Pi + 0.5 (необходимо добавить 0.5, чтобы получить функцию R -> [0,1]
- Решить для х
x = G (y) = tan (y-0.5) * Pi (G является обратным к F - обычно F ^ (- 1)
Теперь просто поместите сгенерированный double как y в функцию:
return Math.tan (rand.nextDouble () - 0.5) * Math.Pi;
Для параметра «Масштаб и местоположение» необходимо сделать только следующее:
X - ваша распределенная стохастическая переменная по Гауссу (то есть: N (0,1)).
Среднее (a * X + b) = a * среднее (X) + b
Var (a * X + b) = a² * Var (X)
a - ваш параметр масштаба, b - ваш параметр местоположения.
Поэтому сгенерируйте стандартную гауссовскую распределенную переменную, умножьте ее на sqrt (scale) и добавьте параметр location.