Paket rand64 menyediakan generator angka acak semu yang menghasilkan angka 64 bit yang tidak ditandatangani dalam rentang [0, 2 64 ).
Implementasi untuk generator nomor acak semu berikut disediakan dalam paketnya sendiri:
Generetor ini mengimplementasikan rand.Source64, sehingga dapat digunakan sebagai sumber untuk rand.Rand (mulai Go 1.8).
Perhatikan bahwa beberapa algoritme menggunakan paket bits dari Go 1.9.
Pembuatan PRNG terlihat seperti ini:
// 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)
Ini adalah versi kenaikan tetap dari generator SplittableRandom Java 8. Lihat juga halaman tentang Generator nomor pseudorandom yang dapat dipisah cepat.
Implementasi Go berdasarkan implementasi referensi C oleh Sebastiano Vigna.
Periode 2 256 -1
Menurut penulis algoritma:
xoshiro256** (XOR/shift/rotate) adalah generator kami yang serbaguna dan kokoh (meskipun demikian, bukan generator yang aman secara kriptografis). Ia memiliki kecepatan (sub-ns) yang sangat baik, ruang keadaan (256 bit) yang cukup besar untuk aplikasi paralel apa pun, dan lulus semua pengujian yang kami ketahui.
Namun, jika seseorang harus menghasilkan hanya angka floating-point 64-bit (dengan mengekstraksi 53 bit teratas) xoshiro256+ adalah generator yang sedikit (≈15%) lebih cepat dengan sifat statistik analog. Untuk penggunaan umum, kita harus mempertimbangkan bahwa bit terendahnya memiliki kompleksitas linier yang rendah dan akan gagal dalam uji linieritas; namun, kompleksitas linier rendah hampir tidak berdampak apa pun dalam praktiknya, dan tentu saja tidak berdampak sama sekali jika Anda menghasilkan bilangan floating-point menggunakan bit atas (kami menghitung perkiraan tepat kompleksitas linier bit terendah).
Periode 2 128 -1
Menurut penulis algoritma:
xoroshiro128** (XOR/rotate/shift/rotate) dan xoroshiro128+ memiliki kecepatan yang sama dengan xoshiro256 dan menggunakan separuh ruang; komentar yang sama berlaku. Mereka hanya cocok untuk aplikasi paralel skala rendah; terlebih lagi, xoroshiro128+ menunjukkan ketergantungan ringan pada bobot Hamming yang menghasilkan kegagalan setelah keluaran 5 TB dalam pengujian kami. Kami yakin sedikit bias ini tidak akan memengaruhi aplikasi apa pun.
Implementasi Go berdasarkan implementasi referensi C oleh David Blackman dan Sebastiano Vigna.
Untuk informasi lebih lanjut, kunjungi generator xoshiro / xoroshiro dan halaman tembak-menembak PRNG.
Periode 2 128
Ini adalah generator kongruensial yang diijinkan sebagaimana didefinisikan dalam
PCG: Sekumpulan Algoritma Sederhana, Cepat, dan Efisien Ruang Secara Statistik Baik untuk Pembuatan Angka Acak
Melissa E. O'Neill, Universitas Harvey Mudd
https://www.cs.hmc.edu/tr/hmc-cs-2014-0905.pdf
Meskipun PCG
mengacu pada seluruh rangkaian algoritme (lihat juga http://pcg-random.org), satu-satunya algoritme yang disediakan adalah PCG XSL RR 128/64 LCG.
Implementasi Go berdasarkan implementasi referensi C oleh Melissa O'Neill dan kontributor Proyek PCG.
Periode 2 19937 -1
Ini adalah implementasi Go murni berdasarkan implementasi mt19937-64.c C oleh Makoto Matsumoto dan Takuji Nishimura.
Informasi lebih lanjut tentang algoritma Mersenne Twister dan implementasi lainnya tersedia dari http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
Perlu diperhatikan bahwa algoritma ini hanya ditujukan untuk aplikasi yang memerlukan interoperabilitas dengan aplikasi lain yang menggunakan algoritma yang sama. Karena diketahui gagal dalam uji statistik sepele dan paling lambat di amd64, penggunaannya untuk tujuan lain tidak disarankan.
Bukan PRNG sebenarnya.
Paket IoRand adalah pembungkus sederhana untuk membaca aliran byte melalui io.Reader. Ini dapat digunakan sebagai pembungkus crypto/rand untuk membuat rand.Source64 untuk paket math/rand:
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 ()
}
}
Tolok ukur ini dilakukan dengan go 1.12.5.
Algoritma | AMD FX-6300 | Inti i5 6200U | LENGAN Korteks-A7 @900MHz |
---|---|---|---|
xoshiro256** | 5,53 ns/operasi | 106,0 ns/operasi | |
xoshiro256+ | 5,48 ns/operasi | 86,1 ns/operasi | |
xoroshiro128** | 5,16 ns/operasi | 79,2 ns/operasi | |
xoroshiro128+ | 5,15 ns/operasi | 62,7 ns/operasi | |
PCG XSL RR 128/64 LCG | 5,29 ns/operasi | 254,0 ns/operasi | |
splitmix64 | 4,30 ns/operasi | 77,5 ns/operasi | |
Mersenne Twister 19937 | 8,82 ns/operasi | 136,0 ns/operasi | |
Gunakan matematika/rand | 7,01 ns/operasi | 68,4 ns/operasi |
Perhatikan bahwa benchmark menunjukkan kinerja lebih lambat dibandingkan rilis sebelumnya. Hal ini disebabkan oleh fakta bahwa kami memanggil Rng.Uint64 secara langsung alih-alih melalui antarmuka rand.Rand64. Untuk melakukan perbandingan yang adil dengan rng perpustakaan standar Go, semua benchmark sekarang melalui antarmuka rand.Source64.
Jauhi splitmix64 dan Mersenne-Twister 19937 yang terhormat.
Sangat sedikit yang diketahui tentang matematika/rand Go (lihat di sini, di sini) dan ada usulan untuk menggantinya dengan generator PCG.
PCG, xoshiro256** dan xoroshiro128** yang disediakan dianggap lulus semua tes yang diketahui; menurut penulisnya masing-masing. Hati-hati dengan kinerja buruk algoritma PCG khusus ini pada platform 32bit (mempengaruhi ARM dan x86).
Rand64 mendukung modul go. Versi sebelumnya 1.x dan 2.x telah dipindahkan ke cabangnya masing-masing. Karena tag semver tanpa go.mod sepertinya mengganggu modul go, tag untuk versi ini telah direset.
Paket ini dirilis berdasarkan ketentuan lisensi ISC (lihat file LISENSI di akar repositori). Selain itu, penggunaan algoritme berikut diatur oleh lisensi tambahan: