The performance has been evaluated on a Pentium Pro 200 MHz with gcc 2.95.2, Linux 2.2.13, glibc 2.1.2. The speed is reported in million random numbers per second (M rn/sec), generated in a tight loop.
generator | M rn/sec | time per random number [usec] | relative speed compared to fastest [percent] |
---|---|---|---|
rand48 | 5.38 | 0.183 | 61% |
rand48 run-time configurable | 1.48 | 0.677 | 17% |
lrand48 glibc 2.1.2 | 1.19 | 0.843 | 13% |
minstd_rand | 2.39 | 0.318 | 35% |
ecuyer1988 | 1.12 | 0.892 | 13% |
kreutzer1986 | 3.87 | 0.258 | 43% |
hellekalek1995 (inversive) | 0.20 | 5.12 | 2% |
mt11213b | 6.07 | 0.165 | 68% |
mt19937 | 6.06 | 0.165 | 68% |
mt19937 original | 5.33 | 0.188 | 60% |
lagged_fibonacci607 | 8.90 | 0.112 | 100% |
lagged_fibonacci4423 | 8.54 | 0.117 | 96% |
lagged_fibonacci19937 | 7.49 | 0.133 | 84% |
lagged_fibonacci23209 | 6.63 | 0.151 | 74% |
lagged_fibonacci44497 | 4.01 | 0.250 | 45% |
Note that the lagged Fibonacci generators produce floating-point numbers, whereas all others produce integers.
[M rn/sec] | minstd_rand | kreutzer1986 | mt19937 | lagged_fibonacci607 |
---|---|---|---|---|
uniform_smallint | 1.26 | 1.55 | 1.93 | - |
uniform_01 | 1.79 | 1.88 | 3.03 | 7.74 |
uniform_real | 1.74 | 1.56 | 2.34 | 6.62 |
geometric | 0.593 | 0.629 | 0.753 | 0.916 |
triangle | 0.97 | 1.02 | 1.35 | 1.31 |
exponential | 0.849 | 0.828 | 0.887 | 1.53 |
normal (polar method) | 0.608 | 0.626 | 0.738 | 0.755 |
lognormal | 0.417 | 0.442 | 0.470 | 0.481 |
uniform_on_sphere | 0.154 | 0.155 | 0.174 | 0.218 |
Note that the lagged Fibonacci generator is at least 2.5 times faster than the Mersenne twister when generating uniformly distributed floating-point numbers. For more sophisticated distributions, the speed improvement is less. Note however that these distributions have not been optimized for speed, yet.