rand64 套件提供偽隨機數產生器,產生 [0, 2 64 ) 範圍內的無符號 64 位數。
以下偽隨機數產生器的實現在其自己的包中提供:
這些生成器實作了 rand.Source64,因此它們可以用作 rand.Rand 的來源(從 Go 1.8 開始)。
請注意,某些演算法使用 Go 1.9 中的位元包。
PRNG 的建立如下所示:
// 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)
這是 Java 8 的 SplittableRandom 產生器的固定增量版本。另請參閱快速可分割偽隨機數產生器頁面。
Go 實作基於 Sebastiano Vigna 的 C 參考實作。
期間 2 256 -1
根據演算法作者的說法:
xoshiro256**(XOR/移位/旋轉)是我們萬能的、堅如磐石的產生器(但不是加密安全的產生器)。它具有出色的(亞納秒)速度,對於任何並行應用程式來說都足夠大的狀態空間(256 位元),並且它通過了我們所知的所有測試。
然而,如果只需產生 64 位元浮點數(透過提取高 53 位元),xoshiro256+ 是一種速度稍快(約 15%)的生成器,具有類似的統計特性。對於一般用途,必須考慮其最低位元具有較低的線性複雜度,並且將無法通過線性測試;然而,低線性複雜度在實踐中幾乎不會產生任何影響,如果您使用高位來產生浮點數(我們計算了最低位線性複雜度的精確估計),則肯定不會產生任何影響。
期間 2 128 -1
根據演算法作者的說法:
xoroshiro128** (XOR/旋轉/移位/旋轉) 和 xoroshiro128+ 與 xoshiro256 具有相同的速度並使用一半的空間;同樣的評論也適用。它們僅適用於低規模並行應用;此外,xoroshiro128+ 對漢明權重表現出輕微的依賴性,在我們的測試中輸出 5 TB 後會出現故障。我們相信這種輕微的偏差不會影響任何應用程式。
Go 實作基於 David Blackman 和 Sebastiano Vigna 的 C 參考實作。
欲了解更多信息,請訪問 xoshiro / xoroshiro 生成器和 PRNG 競賽頁面。
期間 2 128
這是一個排列同餘產生器,定義為
PCG:一系列簡單、快速、節省空間、統計良好的隨機數產生演算法
梅麗莎·E·奧尼爾,哈維穆德學院
https://www.cs.hmc.edu/tr/hmc-cs-2014-0905.pdf
雖然PCG
指的是整個演算法系列(另請參見 http://pcg-random.org),但唯一提供的演算法是 PCG XSL RR 128/64 LCG。
Go 實作基於 Melissa O'Neill 和 PCG 專案貢獻者的 C 參考實作。
第二期19937 -1
這是基於 Makoto Matsumoto 和 Takuji Nishimura 的 mt19937-64.c C 實現的純 Go 實現。
有關 Mersenne Twister 演算法和其他實現的更多信息,請訪問 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
請注意,此演算法僅適用於需要與使用相同演算法的其他應用程式進行互通的應用程式。由於已知它無法通過簡單的統計測試,並且在 amd64 上速度最慢,因此不建議將其用於任何其他目的。
不是真正的 PRNG。
IoRand 套件是一個簡單的包裝器,用於透過 io.Reader 讀取位元組流。它可以用作 crypto/rand 的包裝器來為 math/rand 包建置 rand.Source64 :
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 ()
}
}
這些基準測試是使用 go 1.12.5 完成的。
演算法 | AMD FX-6300 | 酷睿i5 6200U | ARM Cortex-A7 @900MHz |
---|---|---|---|
xoshiro256** | 5.53 奈秒/操作 | 106.0 奈秒/操作 | |
小四郎256+ | 5.48 奈秒/操作 | 86.1 奈秒/操作 | |
克羅四郎128** | 5.16 奈秒/操作 | 79.2 奈秒/操作 | |
異色四郎128+ | 5.15 奈秒/操作 | 62.7 奈秒/操作 | |
PCG XSL RR 128/64 LCG | 5.29 奈秒/操作 | 254.0 奈秒/操作 | |
分割混合64 | 4.30 奈秒/操作 | 77.5 奈秒/操作 | |
梅森龍捲風 19937 | 8.82 奈秒/操作 | 136.0 奈秒/操作 | |
數學/蘭德 | 7.01 奈秒/操作 | 68.4 奈秒/操作 |
請注意,與早期版本相比,基準測試顯示效能較慢。這是因為我們直接呼叫了 Rng.Uint64,而不是透過 rand.Rand64 介面。為了與 Go 標準庫的 rng 進行公平比較,所有基準測試現在都通過 rand.Source64 介面。
遠離 splitmix64 和令人尊敬的 Mersenne-Twister 19937。
人們對 Go 的 math/rand 知之甚少(請參閱此處、此處),並且有人建議用 PCG 生成器替換它。
所提供的 PCG、xoshiro256** 和 xoroshiro128** 據稱可通過所有已知測試;根據各自的作者。不過,請注意該特定 PCG 演算法在 32 位元平台上的較差效能(同時影響 ARM 和 x86)。
rand64 支援 go 模組。先前的版本 1.x 和 2.x 已移至各自的分支。由於沒有 go.mod 的 semver 標籤似乎擾亂了 go 模組,因此這些版本的標籤已被重置。
該軟體包是根據 ISC 許可證條款發布的(請參閱存儲庫根目錄下的 LICENSE 文件)。此外,以下演算法的使用受附加許可證的約束: