Schnelle Zufallszahlen für R mit dqrng

Wer nur wenige aber echte Zufallszahlen benötigt kann Würfel oder atmosphärisches Rauschen nutzen. Wer jedoch viele Zufallszahlen braucht kommt um einen Pseudo-Zufallszahlgenerator (random number generator (RNG)) nicht herum. R unterstützt verschiedene RNGs (vgl. ?Random) und eine Vielzahl von Verteilungsfunktionen (vgl. ?distributions). Die zugrundeliegenden Methoden sind zwar gut getestet, gehören aber nicht zu den schnellsten verfügbaren Methoden. Das dqrng Paket stellt schnelle Zufallszahlgeneratoren mit guten statistischen Eigenschaften für R bereit. Es verbindet diese RNGs mit schnellen Verteilungsfunktionen für Gleich-, Normal- und Exponentialverteilung.

Installation

Derzeit ist dqrng nicht auf CRAN. Die aktuelle Version kann aber über drat installiert werden:

Nutzung

Die Nutzung der enthaltenen RNGs in R ist sehr ähnlich zur Nutzung der eingebauten RNGs:

Diese Zufallszahlgeneratoren sind allerdings deutlich schneller. Zum Vergleich werden hier 10 Millionen Zufallszahlen mit verschiedenen Verteilungen erzeugt:

expr min lq mean median uq max neval
runif 248.16730 251.83371 262.20559 260.33073 265.69415 322.15771 100
dqrunif 34.77413 35.44569 39.40738 36.82459 38.42524 109.96758 100
rnorm 587.40975 596.92850 618.79356 613.08345 624.31043 706.79528 100
dqrnorm 63.17649 64.43796 68.77696 66.80184 68.39577 141.97466 100
rexp 392.79228 397.48715 413.66996 411.14180 420.42473 494.49631 100
dqrexp 52.75875 53.64510 57.15006 55.80021 58.65553 79.11577 100

plot of chunk unnamed-chunk-4

Die r* Funktionen nutzen hier den standard Mersenne-Twister, während für dqr* Xoroshiro128+ zum Einsatz kam. Für rnorm wurde die standard Inversionsmethode genutzt, während dqrnorm (und dqrexp) den Ziggurat Algorithmus aus Boost.Random mit zusätzlichen Verbesserungen nutzt.

Sowohl die RNGs als auch die Verteilungsfunktionen sind als C++ header only Bibliothek enthalten. Die Vignette zeigt Möglichkeiten zur Nutzung in C++.

Unterstützte Zufallszahlgeneratoren

Folgende 64 bit RNGs werden derzeit unterstützt:

  • Mersenne-Twister
    Die 64 bit Variante des Mersenne-Twister ist der standard RNG. Dies ist eine konservative Wahl die es erlaubt die schnellen Verteilungsfunktionen zu nutzen und dennoch nahe an Rs standard RNG (32 bit Mersenne-Twister) zu bleiben.
  • pcg64
    Die Standard 64 bit Variante aus der PCG Familie entwickelt von Melissa O’Neill. Siehe http://www.pcg-random.org für weitere Informationen.
  • Xoroshiro128+, Xorshift128+, and Xorshift1024*
    Diese überwiegend von Sebastiano Vigna enwickelten RNGs werden von Erlang und verschiedenen JavaScript-Implementierungen als standard RNG genutzt. Siehe http://xoroshiro.di.unimi.it/ für weiter Informationen.