我目前正在实施 George Marsaglia 的 Ziggurat 随机数生成器的一个版本。尽管它被认为是生成高质量正态分布随机数生成器的最快方法之一,但它充满了循环控制代码(即循环中间的返回语句、if 语句、分支等),它使多次调用标准 C 函数,如 exp() 和 log()。更不用说无限循环了。
这使得编译器无法流水线化的代码。最终,我觉得一个基本的方法,比如直接使用中心极限定理,最终可能会更快,因为它可以很容易地流水线化。不幸的是,它不适合高斯分布的尾部,因此它不适合我的应用程序。
这里有没有人对如何减少控制代码和函数调用有任何想法。我目前正在使用Colin Green 的我移植到 C 的算法的实现。我的底层统一生成器是 Tiny Mersenne Twister(所以请不要像我看到其他人那样告诉我使用 MT,我已经那里。这个讨论是针对正态分布的RNG,而不是均匀的RNG)。