Возможно, это не тот ответ, который вы ищете, а конкретный случай с 3 равномерными распределениями:
(Игнорируйте числа слева, но это в масштабе!)
public int generate() {
if(random(0, 65) == 0) {
// 50-100 percentile
if(random(1, 13) > 3) {
// 50-75 percentile
return random(500, 5000);
} else {
// 75-100 percentile
return random(5000, 20000);
}
} else {
// 0-50 percentile
return random(200, 500);
}
}
Как я получил цифры
Во-первых, площадь под кривой равна между 200-500 и 500-20000. Это означает, что отношение высоты 300 * leftHeight == 19500 * rightHeight
делает leftHeight == 65 * rightHeight
Это дает нам шанс 1/66 выбрать право и шанс 65/66 выбрать налево.
Затем я произвел те же вычисления для 75-го процентиля, за исключением того, что соотношение было 500-5000 chance == 5000-20000 chance * 10 / 3
. Опять же, это означает, что у нас есть шанс 10/13 быть в 50-75 процентилях, и шанс 3/13 быть в 75-100.
Престижность @Stas - я использую его «включающую случайную» функцию.
И да, я понимаю, что мои числа неверны, так как этот метод работает с дискретными числами, и мои вычисления были непрерывными. Было бы хорошо, если бы кто-то мог исправить мои пограничные случаи.