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:
1 2 3 4 |
if (!requireNamespace("drat", quietly = TRUE)) install.packages("drat") drat::addRepo("daqana") install.packages("dqrng") |
Nutzung
Die Nutzung der enthaltenen RNGs in R ist sehr ähnlich zur Nutzung der eingebauten RNGs:
1 2 3 4 5 6 7 8 9 10 |
library(dqrng) dqRNGkind("Xoroshiro128+") dqset.seed(42) dqrunif(5, min = 2, max = 10) ## [1] 4.498747 9.500660 2.457009 5.249195 2.370585 dqrnorm(5, mean = 3, sd = 5) ## [1] 5.748100 -4.368370 -1.231515 -7.552863 8.959892 dqrexp(5, rate = 4) ## [1] 0.002043171 0.261604407 0.132934079 0.048892818 0.549762841 |
Diese Zufallszahlgeneratoren sind allerdings deutlich schneller. Zum Vergleich werden hier 10 Millionen Zufallszahlen mit verschiedenen Verteilungen erzeugt:
1 2 3 4 5 6 7 8 9 |
N <- 1e7 tm <- microbenchmark( runif = runif(N), dqrunif = dqrunif(N), rnorm = rnorm(N), dqrnorm = dqrnorm(N), rexp = rexp(N), dqrexp = dqrexp(N)) |
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 |
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.