Вы можете комбинировать различные e методы отбора проб от discrete distributions с непрерывной однородностью.
То есть, имитирует из целочисленной части Y = [X] вашей переменной, которая имеет дискретное распределение с вероятностью, равной вероятности быть в каждом интервале (например, посредством метода таблицы - aka метод псевдонима) , а затем просто добавьте случайную однородную [0,1 $, X = Y + U.
В вашем примере у вас есть Y, принимающий значения 1,2,3 с вероятностью 0,5,0,25 и 0,25 (что эквивалентно выборке 1,1,2,3 с равной вероятностью), а затем добавьте случайную униформу.
Если ваша «гистограмма» действительно велика, это может быть очень быстрый подход.
В R можно сделать простой (если не особенно эффективно) версию этого через
sample(c(1,1,2,3))+runif(1)
или
sample(c(1,1,2,3),n,replace=TRUE)+runif(n)
и вообще можно использовать аргумент вероятности весов в sample
.
Если вам нужна более высокая скорость, чем это вам (и для некоторых приложений вы можете, особенно с большими гистограммами и действительно большими размерами выборки), вы можете немного ускорить дискретную часть, используя подходы, упомянутые в ссылке, и программирование рабочей части этой функции на языке более низкого уровня (например, в C).
Это говорит о том, что даже с использованием вышеуказанного кода со значительно «большой» гистограммой - от десятков до сотен бункеров - этот подход кажется даже на моем довольно неописуемом ноутбуке, чтобы иметь возможность генерировать миллион случайных значений в ну под второй, так что для многих приложений это будет хорошо.
Спасибо, это отлично работает. Можете ли вы объяснить, почему мне нужно обращать cdf? –
ohhhh теперь я получаю его, x <- runif (n) ifelse (x <0.5, 2 * x + 1, 4 * x) это две строки (я все время забываю, что мне не нужно, в R) Сначала вы генерируете равномерное [0,1], а затем отобразить его. Еще раз спасибо –