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 ジェネレーターの固定増分バージョンです。高速分割可能な擬似乱数ジェネレーターに関するページも参照してください。
Sebastiano Vigna による C リファレンス実装に基づいた Go 実装。
第2期256 -1
アルゴリズムの作成者によると、次のようになります。
xohiro256** (XOR/shift/rotate) は、当社の多目的で堅牢なジェネレーターです (ただし、暗号的に安全なジェネレーターではありません)。優れた (ns 未満) 速度、あらゆる並列アプリケーションに十分な大きさの状態空間 (256 ビット) を備えており、私たちが認識しているすべてのテストに合格します。
ただし、(上位 53 ビットを抽出して) 64 ビット浮動小数点数のみを生成する必要がある場合、xohiro256+ は、同様の統計特性を備えたわずかに (約 15%) 高速なジェネレーターです。一般的な使用法では、最下位ビットの線形複雑性が低く、線形性テストに合格しないことを考慮する必要があります。ただし、低い線形複雑さは実際にはほとんど影響を及ぼさない可能性があり、上位ビットを使用して浮動小数点数を生成する場合にはまったく影響がありません (私たちは最下位ビットの線形複雑さの正確な推定値を計算しました)。
第2期128 -1
アルゴリズムの作成者によると、次のようになります。
xorohiro128** (XOR/回転/シフト/回転) および xorohiro128+ は、xoshiro256 と同じ速度で、スペースの半分を使用します。同じコメントが当てはまります。これらは、小規模な並列アプリケーションにのみ適しています。さらに、xorohiro128+ はハミング重みに軽度の依存性を示し、テストでは 5 TB の出力後に障害が発生しました。私たちは、このわずかな偏りがアプリケーションに影響を与えることはないと信じています。
Go の実装は、David Blackman と Sebastiano Vigna による C リファレンス実装に基づいています。
詳細については、xohiro / xorohiro ジェネレーターと 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 のみです。
Melissa O'Neill と PCG プロジェクトの貢献者による C リファレンス実装に基づいた Go 実装。
第2期19937-1
これは、松本誠氏と西村拓司氏による mt19937-64.c C 実装に基づく純粋な Go 実装です。
メルセンヌ ツイスター アルゴリズムとその他の実装の詳細については、http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html を参照してください。
このアルゴリズムは、同じアルゴリズムを使用する他のアプリケーションとの相互運用性を必要とするアプリケーションのみを対象としていることに注意してください。これは簡単な統計テストに失敗することが知られており、amd64 では最も遅いため、他の目的での使用は推奨されません。
実際の PRNG ではありません。
IoRand パッケージは、io.Reader を介してバイト ストリームを読み取るための単純なラッパーです。これは、 math/rand パッケージの rand.Source64 を構築するための crypto/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 ()
}
}
これらのベンチマークは go 1.12.5 で行われました。
アルゴリズム | AMD FX-6300 | コアi5 6200U | ARM Cortex-A7 @900MHz |
---|---|---|---|
xohiro256** | 5.53ns/動作 | 106.0ns/動作 | |
xoshiro256+ | 5.48ns/動作 | 86.1ns/動作 | |
xorohiro128** | 5.16ns/動作 | 79.2ns/動作 | |
しろしろ128+ | 5.15ns/動作 | 62.7ns/動作 | |
PCG XSL RR 128/64 LCG | 5.29ns/動作 | 254.0ns/動作 | |
スプリットミックス64 | 4.30ns/動作 | 77.5ns/動作 | |
メルセンヌ ツイスター 19937 | 8.82ns/動作 | 136.0ns/動作 | |
数学/ランドに行く | 7.01ns/動作 | 68.4ns/動作 |
ベンチマークでは、以前のリリースと比較してパフォーマンスが低下していることが示されていることに注意してください。これは、rand.Rand64 インターフェイスを経由せずに Rng.Uint64 を直接呼び出したことが原因です。 Go 標準ライブラリの rng と公正な比較を行うために、すべてのベンチマークは rand.Source64 インターフェイスを経由するようになりました。
Splitmix64 や由緒ある Mersenne-Twister 19937 には近づかないでください。
Go の数学/ランドについてはほとんど知られておらず (ここ、ここを参照)、それを PCG ジェネレーターに置き換えるという提案があります。
提供されている PCG、xohiro256** および xorohiro128** は、既知のすべてのテストに合格すると評判です。それぞれの著者によると。ただし、32 ビット プラットフォームでは、この特定の PCG アルゴリズムのパフォーマンスが低下することに注意してください (ARM と x86 の両方に影響します)。
rand64 は go モジュールをサポートしています。以前のバージョン 1.x および 2.x は、それぞれのブランチに移動されました。 go.mod のない semver タグが go モジュールを混乱させるようだったので、これらのバージョンのタグはリセットされました。
このパッケージは、ISC ライセンスの条件に基づいてリリースされます (リポジトリのルートにある LICENSE ファイルを参照)。さらに、次のアルゴリズムの使用には追加のライセンスが適用されます。