Das Paket rand64 stellt Pseudozufallszahlengeneratoren bereit, die vorzeichenlose 64-Bit-Zahlen im Bereich [0, 2 64 ] liefern.
Implementierungen für die folgenden Pseudozufallszahlengeneratoren werden in eigenen Paketen bereitgestellt:
Diese Generatoren implementieren rand.Source64, sodass sie als Quelle für rand.Rand verwendet werden können (ab Go 1.8).
Beachten Sie, dass einige Algorithmen das Bits-Paket von Go 1.9 verwenden.
Die Erstellung eines PRNG sieht folgendermaßen aus:
// create a source with the xoshiro256**
source := &xoshiro.Rng256SS{}
// use it as a source in rand.New
rng := rand.New(&source)
// Seed it from a single int64 (negative values are accepted)
rng.Seed(int64Seed)
Dies ist eine Version des SplittableRandom-Generators von Java 8 mit fester Inkrementierung. Siehe auch die Seite über schnelle teilbare Pseudozufallszahlengeneratoren.
Go-Implementierung basierend auf einer C-Referenzimplementierung von Sebastiano Vigna.
Periode 2 256 -1
Laut den Autoren des Algorithmus:
xoshiro256** (XOR/Shift/Rotate) ist unser absolut robuster Allzweckgenerator (allerdings kein kryptografisch sicherer Generator). Es verfügt über eine hervorragende Geschwindigkeit (sub-ns), einen Zustandsraum (256 Bit), der groß genug für jede parallele Anwendung ist, und besteht alle uns bekannten Tests.
Wenn man jedoch nur 64-Bit-Gleitkommazahlen generieren muss (durch Extrahieren der oberen 53 Bits), ist xoshiro256+ ein etwas (≈15 %) schnellerer Generator mit analogen statistischen Eigenschaften. Für den allgemeinen Gebrauch muss man bedenken, dass die niedrigsten Bits eine geringe lineare Komplexität aufweisen und die Linearitätstests nicht bestehen. Allerdings kann eine geringe lineare Komplexität in der Praxis kaum Auswirkungen haben und hat sicherlich überhaupt keine Auswirkungen, wenn Sie Gleitkommazahlen mit den oberen Bits generieren (wir haben eine genaue Schätzung der linearen Komplexität der niedrigsten Bits berechnet).
Periode 2 128 -1
Laut den Autoren des Algorithmus:
xoroshiro128** (XOR/rotate/shift/rotate) und xoroshiro128+ haben die gleiche Geschwindigkeit wie xoshiro256 und belegen die Hälfte des Platzes; Es gelten die gleichen Kommentare. Sie eignen sich nur für kleine Parallelanwendungen; Darüber hinaus weist xoroshiro128+ eine leichte Abhängigkeit bei den Hamming-Gewichten auf, die in unserem Test nach 5 TB Ausgabe zu einem Fehler führt. Wir glauben, dass diese leichte Voreingenommenheit keine Auswirkungen auf irgendeine Anwendung haben kann.
Go-Implementierung basierend auf einer C-Referenzimplementierung von David Blackman und Sebastiano Vigna.
Weitere Informationen finden Sie unter den Xoshiro-/Xoroshiro-Generatoren und auf der PRNG-Shootout-Seite.
Periode 2 128
Dies ist ein permutierter Kongruenzgenerator wie in definiert
PCG: Eine Familie einfacher, schneller, platzsparender, statistisch guter Algorithmen zur Zufallszahlengenerierung
Melissa E. O'Neill, Harvey Mudd College
https://www.cs.hmc.edu/tr/hmc-cs-2014-0905.pdf
Während sich PCG
auf eine ganze Familie von Algorithmen bezieht (siehe auch http://pcg-random.org), ist der einzige bereitgestellte Algorithmus PCG XSL RR 128/64 LCG.
Go-Implementierung basierend auf der C-Referenzimplementierung von Melissa O'Neill und den Mitwirkenden des PCG-Projekts.
Zeitraum 2 19937 -1
Dies ist eine reine Go-Implementierung, die auf der C-Implementierung mt19937-64.c von Makoto Matsumoto und Takuji Nishimura basiert.
Weitere Informationen zum Mersenne Twister-Algorithmus und anderen Implementierungen finden Sie unter http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
Beachten Sie, dass dieser Algorithmus nur für Anwendungen gedacht ist, die Interoperabilität mit anderen Anwendungen benötigen, die denselben Algorithmus verwenden. Da es bekanntermaßen triviale statistische Tests nicht besteht und unter amd64 am langsamsten ist, wird seine Verwendung für andere Zwecke nicht empfohlen.
Kein echtes PRNG.
Das IoRand-Paket ist ein einfacher Wrapper zum Lesen von Byteströmen über io.Reader. Es kann als Wrapper um crypto/rand verwendet werden, um eine rand.Source64 für das math/rand-Paket zu erstellen:
package main
import (
"bufio"
crand "crypto/rand"
"encoding/binary"
"math/rand"
"github.com/db47h/rand64/v3/iorand"
)
// Wrap crypto/rand in an IoRand
func main () {
// first, wrap crypto/rand.Reader in a buffered bufio.Reader
bufferedReader := bufio . NewReader ( crand . Reader )
// Create the new IoRand Source
ior := iorand . New ( bufferedReader , binary . LittleEndian )
// use it as rand.Source64
rng := rand . New ( ior )
// get random numbers...
for i := 0 ; i < 4 ; i ++ {
_ = rng . Uint64 ()
}
}
Diese Benchmarks wurden mit go 1.12.5 durchgeführt.
Algorithmus | AMD FX-6300 | Core i5 6200U | ARM Cortex-A7 bei 900 MHz |
---|---|---|---|
xoshiro256** | 5,53 ns/op | 106,0 ns/op | |
xoshiro256+ | 5,48 ns/op | 86,1 ns/op | |
xoroshiro128** | 5,16 ns/op | 79,2 ns/op | |
xoroshiro128+ | 5,15 ns/op | 62,7 ns/op | |
PCG XSL RR 128/64 LCG | 5,29 ns/op | 254,0 ns/op | |
splitmix64 | 4,30 ns/op | 77,5 ns/op | |
Mersenne Twister 19937 | 8,82 ns/op | 136,0 ns/op | |
Gehen Sie Mathe/Rand | 7,01 ns/op | 68,4 ns/op |
Beachten Sie, dass die Benchmarks im Vergleich zu früheren Versionen eine langsamere Leistung zeigen. Dies liegt daran, dass wir Rng.Uint64 direkt aufgerufen haben, anstatt über die rand.Rand64-Schnittstelle zu gehen. Um einen fairen Vergleich mit dem RNG der Go-Standardbibliothek durchzuführen, durchlaufen alle Benchmarks jetzt eine rand.Source64-Schnittstelle.
Halten Sie sich von splitmix64 und dem ehrwürdigen Mersenne-Twister 19937 fern.
Über Gos Mathematik/Rand ist sehr wenig bekannt (siehe hier, hier) und es gibt einen Vorschlag, es durch einen PCG-Generator zu ersetzen.
Das bereitgestellte PCG, xoshiro256** und xoroshiro128** soll alle bekannten Tests bestehen; nach Angaben ihrer jeweiligen Autoren. Achten Sie jedoch auf die schlechte Leistung dieses speziellen PCG-Algorithmus auf 32-Bit-Plattformen (betrifft sowohl ARM als auch x86).
Rand64 unterstützt Go-Module. Die Vorgängerversionen 1.x und 2.x wurden in ihre jeweiligen Zweige verschoben. Da einige Tags ohne go.mod die Go-Module zu stören schienen, wurden die Tags für diese Versionen zurückgesetzt.
Dieses Paket wird unter den Bedingungen der ISC-Lizenz veröffentlicht (siehe LICENSE-Datei im Stammverzeichnis des Repositorys). Darüber hinaus unterliegt die Nutzung der folgenden Algorithmen zusätzlichen Lizenzen: