В настоящее время я расширяю имитационную модель, которая сильно зависит от случайных нормальных распределенных чисел. В настоящее время он использует std :: normal_distribution, но он слишком медленный.
Есть ли способ реализовать быстрое случайное нормальное распределение? Значения не должны быть уникальными, если они соответствуют нормальному распределению.
Генератор зиккурата Марсалья и Цанг (JSS, 2000) был замечен как статистически обоснованным и быстрым. Однако вы хотите пересмотренный нормальный генератор Ziggurat, который использует лучший базовый унифицированный генератор согласно комментарию Леонг и др. (JSS, 2005).
У меня есть оригинальные статьи, а также несколько обзорных работ. в этом каталоге GitHub которая является частью реализации Ziggurat C ++ для R.
std::normal_distribution
это распределение, а не генератор. Вы можете попробовать другой генератор из стандартной библиотеки и посмотреть, какой самый быстрый (см. http://en.cppreference.com/w/cpp/numeric/random).
Если качество чисел не так важно, вы можете использовать очень простые алгоритмы, такие как r=++i%6
, например.
Линейный конгруэнтный генератор тоже легко реализовать (на самом деле, самый стандартный rand()
реализация использует некоторую реализацию этого. Тем не менее, это, вероятно, не будет быстрее, чем при использовании std::linear_congruential_engine
, На указанном выше сайте есть также несколько «настроенных» генераторов случайных чисел.
Есть также алгоритм поздней Марсалии, который можно найти Вот и который является весьма эффективным w.r.t. производительность и качество номера.
В конце убедитесь, что вы используете правильные флаги оптимизации при тестировании производительности.
Стандарт <random>
библиотека позволяет генерировать случайные числа, используя комбинации генераторов и распределений. Вы используете нормальный дистрибутив, и вам нужен более быстрый генератор, чем по умолчанию, посмотрите Вот.