То, что вы в основном делаете здесь, это инвертирование кумулятивной функции распределения . Пусть F
будет CDF случайной величины X
с заданным распределением, тогда оно определяется как F(x) == P[X <= x]
.
Очень полезная вещь здесь - это то, что если вы генерируете равномерную случайную переменную U
между 0 и 1, то
P[F^-1(U) <= x] == P[U <= F(x)] == F(x) == P[X <= x]
, что означает, что F^-1(U)
будет иметь такое же распределение, что и X
!
Конечно, это возможно только в том случае, если вы можете инвертировать CDF, но в вашем случае F
является кусочной функцией (например, лестницей), и ваш алгоритм определяет для заданного равномерного значения, на каком шаге это значение встретились. Следовательно, ваш алгоритм совершенно верен.
Однако вы можете улучшить его, если у вас есть много случайных чисел для генерации: сначала сгенерируйте таблицу CDF, которая в вашем случае будет
CDF[] = {.1, .25, .5, .55, 1.}
затем для каждого сгенерированного равномерного числа от 0 до 1 просто выполните дихотомию для таблицы CDF, чтобы получить соответствующий индекс повторно.