Die Normalverteilung ist die bedeutendste Verteilung. Normalverteilte Zufallszahlen finden in stochastischen Modellen und Simulationen häufig Verwendung. Daher ist es für eine performante Simulationssoftware unerlässlich diese hochgradig performant ziehen zu können.
Die Standardmethode in jave.util.Random ist jedoch nicht auf Performance ausgelegt. Sehr viel besser ist der Ziggurat Algorithmus von George Marsaglia und Wai Wan Tsang aus dem Jahr 2000.
Da ich keine Implementierung in Java gefunden habe, habe ich selbst eine aus c portiert.
In der unten stehenden Tabelle habe ich die Zeiten für das Ziehen von 1.000.000.000 Zufallszahlen zwischen der Standard Implementierung in java6 und dem Ziggurat Algorithmus verglichen. Danach ist Ziggurat acht mal schneller als java6.
| Methode | Zeit java6 / ms | Zeit Ziggurat / ms | rel. Performance |
|---|---|---|---|
| nextInt() | 27256 | 3683 | 13.5% |
| nextDouble() | 51515 | 3876 | 7.5% |
| nextGaussian() | 149905 | 18562 | 12,3% |
Die Richtigkeit der Java Implementierung wurde durch einen Vergleich mit der Zufallszahlenfolge der c Implementierung nachgewiesen.
Den Quellcode der Ziggurat Klasse findet man hier.