Я нашел это решение, используя выборку с обратным преобразованием:
http://preshing.com/20111007/how-to-generate-random-timings-for-a-poisson-process
Он не использует подход выборки с отбраковкой, эффективен и точен.
Этоиспользует тот факт, что распределение времени между событиями является экспоненциальным распределением с параметром lambda, который является скоростью поступления.Экспоненциальное распределение - лямбда-эксп (-lambda x).Чтобы выбрать значения из этого распределения и избежать выборки отклонения, проще использовать функцию накопительного распределения (CDF): 1 - exp (-lambda x).CDF - это функция, которая начинается с 0,0 и увеличивается до 1,0 с параметрами larget.Интуитивно понятно, что вероятность того, что вы получите событие, увеличивается с течением времени.
Чтобы произвести выборку CDF и снова избежать выборки отклонения, проще выбрать равномерное случайное число U между [0,1] и довставьте это значение в обратную функцию CDF, которая дает: nextEvent = - Ln (U) / lambda.Поскольку Ln (0) не определено, и большинство генераторов случайных чисел включают 0.0 и исключают 1.0, безопаснее использовать: nextEvent = -Ln (1.0-U) / lambda.Если ваш код использует миллисекундную функцию времени / сна, вы можете использовать:
double rate = 20.0 / 1000.0;// в среднем 20 в секунду
sleep (floor (-1.0 * log (1.0 - rand () * 1.0 / RAND_MAX) / rate));