
XORシフト乱数生成器はシフトレジスタ生成器とも呼ばれ、ジョージ・マルサリアによって発明された擬似乱数生成器の一種です。[1]これらは線形フィードバックシフトレジスタ(LFSR)のサブセットであり、疎多項式を過度に使用することなくソフトウェアで特に効率的な実装を可能にします。[2]これらは、ある数値とその数値のビットシフトされたバージョンとの排他的論理和を繰り返し取ることで、シーケンス内の次の数値を生成します。これにより、現代のコンピュータアーキテクチャでの実行が非常に効率的になりますが、ハードウェア実装の効率性には役立ちません。すべてのLFSRと同様に、長い周期を実現するためには、パラメータを非常に慎重に選択する必要があります。[3]
ソフトウェアで実行するには、XOR シフト ジェネレータは最も高速な PRNG の 1 つであり、非常に小さなコードと状態を必要とします。ただし、さらに改良しなければ、すべての統計テストに合格するわけではありません。この弱点は、元の論文で説明されているように、非線形関数と組み合わせることで修正されます。単純な XOR シフト ジェネレータ (非線形ステップなし) は、一部の統計テストに合格しないため、信頼性が低いと非難されてきました。[3] : 360
実装例
3つの排他的論理和シフトアルゴリズム[1] :4,5 のCバージョン[ a ]をここに示します。最初のアルゴリズムは、32ビットの状態ワードが1つあり、周期は2 32 −1です。2番目のアルゴリズムは、64ビットの状態ワードが1つあり、周期は2 64 −1です。最後のアルゴリズムは、32ビットの状態ワードが4つあり、周期は2 128 −1です。128ビットアルゴリズムは、diehardテストに合格します。しかし、TestU01フレームワークのBigCrushテストスイートのMatrixRankテストとLinearCompテストには合格しません。
すべて 3 つのシフトと 3 つまたは 4 つの排他的論理和演算を使用します。
#include <stdint.h>
構造体xorshift32_state { uint32_t a ; };
/* 状態はゼロ以外に初期化する必要があります */
uint32_t xorshift32 ( struct xorshift32_state * state ) { /* Marsaglia の 4 ページ「Xorshift RNGs」のアルゴリズム「xor」 */ uint32_t x = state -> a ; x ^= x << 13 ; x ^= x >> 17 ; x ^= x << 5 ; return state -> a = x ; }
構造体xorshift64_state { uint64_t a ; };
uint64_t xorshift64 ( struct xorshift64_state * state ) { uint64_t x = state -> a ; x ^= x << 13 ; x ^ = x >> 7 ; x ^= x << 17 ;戻り値 state -> a = x ; }
/* struct xorshift128_state は、サポートされている場合は uint64_t のペア
または uint128_t として定義することもできます */
struct xorshift128_state { uint32_t x [ 4 ]; };
/* 状態はゼロ以外に初期化する必要があります */
uint32_t xorshift128 ( struct xorshift128_state * state ) { /* Marsaglia の 5 ページにあるアルゴリズム "xor128"、「Xorshift RNGs」 */ uint32_t t = state -> x [ 3 ]; uint32_t s = state -> x [ 0 ]; /* 不自然な 32 ビット シフトを実行します。 */ state -> x [ 3 ] = state -> x [ 2 ]; state -> x [ 2 ] = state -> x [ 1 ]; state -> x [ 1 ] = s ;
t ^= t << 11 ; t ^= t >> 8 ;状態を返す-> x [ 0 ] = t ^ s ^ ( s >> 19 ); }
64ビットワードの状態の場合、排他的論理和とシフトの2組で周期2 64 −1を保持するパラメータが存在する。 [4]
#include <stdint.h>
構造体xorshift64_state { uint64_t a ; };
uint64_t xorshift64 ( struct xorshift64_state * state ) { uint64_t x = state -> a ; x ^= x << 7 ; x ^= x >> 9 ;戻り値state -> a = x ; }
非線形変化
すべての xorshift ジェネレーターは、 BigCrushテスト スイートのいくつかのテストに失敗します。これは、メルセンヌ ツイスターやWELLなどの線形再帰に基づくすべてのジェネレーターに当てはまります。ただし、このようなジェネレーターの出力をスクランブルして品質を向上させるのは簡単です。
+および*として知られるスクランブラーは、下位ビットに依然として弱点を残しているため、[5]浮動小数点数の最下位ビットが解釈された値に与える影響が小さい浮動小数点数での使用を目的としています。[6]一般的な目的では、スクランブラー** (スタースターと発音) は、LFSR ジェネレーターがすべてのビットを通過させます。
クソワオ
マルサリアは、出力を 2 32 を法とする単純な加法カウンタと組み合わせることでスクランブルすることを提案した(彼はこれをワイルの等分布定理にちなんで「ワイル列」と呼んでいる)。これにより周期も 2 32倍になり、 2 192 −2 32になる。
#include <stdint.h>
構造体xorwow_state { uint32_t x [ 5 ]; uint32_tカウンター; };
/* 状態配列は、最初の 4 ワードがすべてゼロにならないように初期化する必要があります */
uint32_t xorwow ( struct xorwow_state * state ) { /* Marsaglia の 5 ページ、「Xorshift RNGs」のアルゴリズム「xorwow」 */ uint32_t t = state -> x [ 4 ]; uint32_t s = state -> x [ 0 ]; /* 不自然な 32 ビット回転を実行します。 */ state -> x [ 4 ] = state -> x [ 3 ]; state -> x [ 3 ] = state -> x [ 2 ]; state -> x [ 2 ] = state -> x [ 1 ]; state -> x [ 1 ] = s ; t ^= t >> 2 ; t ^= t << 1 ; t ^= s ^ ( s << 4 ); state -> x [ 0 ] = t ; state -> counter += 362437 ; t + state -> counter を返す; }
これはうまく機能しますが、BigCrushのいくつかのテストに失敗します。[7]このジェネレーターは、NvidiaのCUDAツールキット のデフォルトです。[8]
xorshift*
xorshift*ジェネレータは、Marsaglia が提案したように、非線形変換として可逆乗算 (ワード サイズを法とする) をxorshiftジェネレータの出力に適用します。 [1]すべてのxorshift*ジェネレータは、最大可能な次元で均等に分散された値のシーケンスを出力します(ただし、16 回の呼び出し、つまり 128 バイト連続してゼロを出力することはありません)。[9]
次の64ビットジェネレータの最大周期は264−1である。 [ 9]
#include <stdint.h>
/* xorshift64s、表 5 の 3 行目の乗数 M_32 を使用したバリアント A_1(12,25,27) */
uint64_t xorshift64star ( void ) { /* 初期シードは 0 以外である必要があります。マルチスレッドの場合は状態に対して静的変数を使用しないでください */ static uint64_t x = 1 ; x ^= x >> 12 ; x ^= x << 25 ; x ^= x >> 27 ; return x * 0x2545F4914F6CDD1DULL ; }
このジェネレーターはBigCrushのMatrixRankテストにのみ失敗しますが、ジェネレーターを上位32ビットのみを返すように変更すると、BigCrushに失敗なしで合格します。[10] : 7 実際、内部状態が40ビットだけの縮小版はスイートに合格しており、大きな安全マージンがあることを示しています。[10] : 19 Numerical Recipes [11]で提案されている同様のジェネレーターもBirthdaySpacingsテストRanQ1に失敗します。
Vigna [9]は、 1024ビットの状態と最大周期2 1024 −1を持つ次のxorshift1024*ジェネレータを提案しているが、これは必ずしもBigCrushを通過するわけではない。[5]したがって、xoshiro256**の方がはるかに優れた選択肢である。
#include <stdint.h>
/* 配列に少なくとも 1 つの非ゼロ要素が存在するように状態をシードする必要があります */
struct xorshift1024s_state { uint64_t x [ 16 ]; int index ; };
uint64_t xorshift1024s ( struct xorshift1024s_state * state ) { int index = state -> index ; uint64_t const s = state -> x [ index ++ ]; uint64_t t = state -> x [ index &= 15 ]; t ^= t << 31 ; // a t ^= t >> 11 ; // b -- ここでも、シフトと乗数は調整可能ですt ^= s ^ ( s >> 30 ); // c state -> x [ index ] = t ; state -> index = index ; return t * 1181783497276652981ULL ; }
xorshift+
xorshift +ジェネレータは、メルセンヌツイスターやWELLよりも1桁少ない失敗率を達成できます。BigCrushスイートのすべてのテストに合格するxorshift+ジェネレータのネイティブC実装は、命令パイプラインのおかげで、通常x86上で10クロックサイクル未満で乱数を生成できます。[12]
乗算を使用する代わりに、より高速な非線形変換として加算を使用することもできます。このアイデアは、斎藤と松本(メルセンヌツイスターの責任者でもある)によって、 32ビットシフトに基づく基礎となるxorshiftジェネレータの連続する2つの出力を加算するXSaddジェネレータで最初に提案されました。 [13]ただし、連続した出力を加算することの1つの欠点は、基礎となるxorshift128ジェネレータが2次元的に等分散であるのに対し、 xorshift128+ジェネレータは1次元的にしか等分散ではないことです。[14]
XSadd は出力の下位ビットに弱点があり、出力ワードがビット反転されている場合、いくつかの BigCrush テストに失敗します。この問題を修正するために、Vigna は64 ビット シフトに基づくxorshift+ファミリ[14]を導入しました。xorshift +ジェネレータは、 xorshift1024+と同じくらい大きい場合でも、出力の下位ビットに検出可能な線形性を示します。[5]これは BigCrush を通過しますが、各 64 ビット ワードから 32 の下位ビットが逆順で使用される場合は通過しません。[5]このジェネレータは、BigCrush を通過する最も高速なジェネレータの 1 つです。[12]
次のxorshift128+ジェネレーターは 128 ビットの状態を使用し、最大周期は 2 128 −1 です。
#include <stdint.h>
構造体xorshift128p_state { uint64_t x [ 2 ]; };
/* 状態はすべてゼロにならないようにシードする必要があります */
uint64_t xorshift128p ( struct xorshift128p_state * state ) { uint64_t t = state -> x [ 0 ]; uint64_t const s = state -> x [ 1 ]; state -> x [ 0 ] = s ; t ^= t << 23 ; // a t ^= t >> 18 ; // b -- ここでも、シフトと乗数は調整可能ですt ^= s ^ ( s >> 5 ); // c state -> x [ 1 ] = t ; return t + s ; }
xorshiftr+
xorshiftr+ (r は Reduced の略で、「xorshifter plus」と読む) ジェネレーターは主に xorshift+ をベースにしているが、変更が加えられており、以前のものと比較して大幅に高速化 (特に軽量デバイスの場合) し、ランダム性テスト (TestU01 BigCrush スイートを含む) での成功率も向上している。[15]これは TestU01 の BigCrush スイートのすべてのテストに合格した最速のジェネレーターの 1 つである。xorshift+ と同様に、BigCrush スイートのすべてのテストに合格した xorshiftr+ ジェネレーターのネイティブ C 実装は、命令パイプラインのおかげで、通常x86上で10クロック サイクル未満で乱数を生成できる。[12] [15]
xorshift+とは異なり、xorshiftr+ は、 xorshift スタイルの手順を使用して状態から導出された 2 つの変数の合計を返すのではなく、サイクルの最後の操作で 1 つの変数を返します。ただし、値を返す直前、つまり次のサイクルのシードを調整する段階で加算が行われる点が特徴で、アルゴリズムの名前に「+」が付けられています。状態を含む変数のサイズは、ランダム性スコアを犠牲にすることなく増やすことができますが、軽量デバイスではパフォーマンスの低下が見られる場合があります。
次のxorshiftr128+ジェネレーターは 128 ビットの状態 (2 つの変数を含む) を使用し、最大周期は 2 128 −1 です。
#include <stdint.h>
struct xorshiftr128plus_state { uint64_t s [ 2 ]; // シード};
/* 状態はすべてゼロにならないようにシードする必要があります */
uint64_t xorshiftr128plus ( struct xorshiftr128plus_state * state ) { uint64_t x = state -> s [ 0 ]; uint64_t const y = state -> s [ 1 ]; state -> s [ 0 ] = y ; x ^= x << 23 ; // shift & xor x ^= x >> 17 ; // shift & xor x ^= y ; // xor state -> s [ 1 ] = x + y ; return x ; }
クソシロ
xoshiro (「xor、shift、rotate」の略) と xoroshiro (「xor、rotate、shift、rotate」の略) はシフトに加えて回転を使用します。Vigna によると、これらは xorshift よりも高速で、出力の品質も向上します。[16] [17]
このクラスのジェネレータには、32 ビットおよび 64 ビットの整数と浮動小数点出力のバリエーションがあります。浮動小数点の場合、上位 53 ビット ( binary64の場合) または上位 23 ビット ( binary32の場合) が取得されます。これは、浮動小数点ジェネレータでは上位ビットの方が下位ビットよりも品質が高いためです。アルゴリズムには、jump状態をいくつかのステップ (通常は 2 の累乗) だけ進める関数も含まれています。これにより、多数の実行スレッドを異なる初期状態で開始できます。
32 ビット出力の場合、 xoshiro128** と xoshiro128+ は、uint64_tの代わりにuint32_tを使用し、シフト/回転定数が異なる点を除いて、 xoshiro256** と xoshiro256+ とまったく同じです。
最近では、xoshiro**ジェネレータの代替としてxoshiro++ジェネレータが作られました。これらは、GNU Fortran、 Java、JuliaなどのFortranコンパイラの実装で使用されています。[18]
よしろ256++
xoshiro256++ は、このファミリの汎用 64 ビット乱数ジェネレータです。
/* Sebastiano Vigna の Web サイトに含まれるコードから改変 */
#include <stdint.h>
uint64_t rol64 ( uint64_t x 、int k ) {戻り値( x << k ) | ( x >> ( 64 - k ) ) ); }
構造体xoshiro256pp_state { uint64_t s [ 4 ]; };
uint64_t xoshiro256pp ( struct xoshiro256pp_state * state ) { uint64_t * s = state -> s ; uint64_t const result = rol64 ( s [ 0 ] + s [ 3 ], 23 ) + s [ 0 ] ; uint64_t const t = s [ 1 ] << 17 ;
s [ 2 ] ^= s [ 0 ]; s [ 3 ] ^= s [ 1 ]; s [ 1 ] ^= s [ 2 ]; s [ 0 ] ^= s [ 3 ];
s [ 2 ] ^= t ; s [ 3 ] = rol64 ( s [ 3 ], 45 );
結果を返す; }
よっしゃ
xoshiro256** は出力関数で加算ではなく乗算を使用します。ただし、出力関数は可逆であり、基礎となる状態を簡単に明らかにできることは注目に値します。[19]これは、 GNU Fortran コンパイラ、Lua (Lua 5.4 以降)、および.NETフレームワーク (.NET 6.0 以降)で使用されます。 [18]
/* Sebastiano Vigna の Web サイトに含まれるコードから改変 */
#include <stdint.h>
uint64_t rol64 ( uint64_t x 、int k ) {戻り値( x << k ) | ( x >> ( 64 - k ) ) ); }
構造体xoshiro256ss_state { uint64_t s [ 4 ]; };
uint64_t xoshiro256ss ( struct xoshiro256ss_state * state ) { uint64_t * s = state -> s ; uint64_t const result = rol64 ( s [ 1 ] * 5 , 7 ) * 9 ; uint64_t const t = s [ 1 ] << 17 ;
s [ 2 ] ^= s [ 0 ]; s [ 3 ] ^= s [ 1 ]; s [ 1 ] ^= s [ 2 ]; s [ 0 ] ^= s [ 3 ];
s [ 2 ] ^= t ; s [ 3 ] = rol64 ( s [ 3 ], 45 );
結果を返す; }
よしろ256+
xoshiro256+ は xoshiro256** よりも約 15% 高速ですが、最下位 3 ビットの線形複雑度は低いため、上位 53 ビットを抽出して浮動小数点結果を得る場合にのみ使用する必要があります。
#include <stdint.h>
uint64_t rol64 ( uint64_t x 、int k ) {戻り値( x << k ) | ( x >> ( 64 - k ) ) ); }
構造体xoshiro256p_state { uint64_t s [ 4 ]; };
uint64_t xoshiro256p ( struct xoshiro256p_state * state ) { uint64_t * s = state -> s ; uint64_t const result = s [ 0 ] + s [ 3 ]; uint64_t const t = s [ 1 ] << 17 ;
s [ 2 ] ^= s [ 0 ]; s [ 3 ] ^= s [ 1 ]; s [ 1 ] ^= s [ 2 ]; s [ 0 ] ^= s [ 3 ];
s [ 2 ] ^= t ; s [ 3 ] = rol64 ( s [ 3 ], 45 );
結果を返す; }
シロシロ
スペースが限られている場合、xoroshiro128** とxoroshiro128+ はxoshiro256** と xoshiro256+ と同等です。これらは状態空間が小さいため、大規模並列プログラムにはあまり役立ちません。xoroshiro128+ は人口カウントに軽度の依存性を示し、5 TBの出力。著者らは、これが現実世界のプログラムで検出できるとは考えていない。Marsagliaの伝統を継承するのではなく、排他的論理和シフト基本的な操作として、よろしーセバスティアーノ・ヴィニャとデイヴィッド・ブラックマンが共同で設計したシフト/回転ベースの線形変換を使用します。その結果、速度と統計品質が大幅に向上しました。 [20]
xoroshiro64** と xoroshiro64* は、xoroshiro128** と xoroshiro128+ と同等です。xoshiro ジェネレータとは異なり、これらは、より高精度のジェネレータをそのまま移植したものではありません。
統計品質
生成された出力の最下位ビットはよろしー品質が低い。よろしーすべての統計テストに合格していないことを認め、
これは xoroshiro128+ 1.0 で、浮動小数点数用の最高かつ最速のスモールステート ジェネレータです。xoroshiro128** よりわずかに高速なので、浮動小数点数生成には上位ビットを使用することをお勧めします。下位 4 ビットは線形性テスト (それだけ) に失敗する可能性があるため、私たちが認識しているすべてのテストに合格しています。したがって、線形複雑度の低さが問題にならない場合 (通常はそうなります)、64 ビット出力の生成にも使用できます。さらに、このジェネレータにはハミング重み依存性が非常にわずかであるため、テスト (http://prng.di.unimi.it/hwd.php) は 5 TB の出力後に失敗します。このわずかな偏りはアプリケーションには影響しないと考えています。心配な場合は、xoroshiro128** または xoshiro256+ を使用してください。
ランダムなブール値を抽出するには符号テストを使用し、ビットのサブセットを抽出するには右シフトを使用することをお勧めします。
状態はどこでもゼロにならないようにシードする必要があります。64 ビットのシードがある場合は、splitmix64 ジェネレーターをシードし、その出力を使用して s を埋めることをお勧めします。
注: このバージョンのパラメータ(a=24、b=16、c=37)はわずかに
私たちのテストでは2016年版よりも良い結果が得られました(a=55、b=14、c=36)。[21]
テストに合格しないというこれらの主張は、入力に対して PractRand を実行することで確認でき、次のような出力が得られます。
PractRand バージョン 0.93 を使用した RNG_test RNG = RNG_stdin64、シード = 0xfac83126 テストセット = 通常、折りたたみ = 標準 (64 ビット) rng=RNG_stdin64、シード=0xfac83126 長さ = 128 メガバイト (2^27 バイト)、時間 = 2.1 秒 テスト名 生処理済み評価 [Low1/64]BRank(12):256(2) R= +3748 p~= 3e-1129 FAIL !!!!!!!! [Low1/64]BRank(12):384(1) R= +5405 p~= 3e-1628 FAIL !!!!!!!! ...そして異常のない146件のテスト結果
著者らは謝辞を述べて次のように続けている。
ランダムなブール値を抽出するには符号検定を使用することを提案する[21]
したがって、プログラマーは最上位ビットを優先する必要があります (つまり、random_number < 0ではなく と 書いて表/裏を作る)。ただし、メルセンヌ ツイスターとWELLrandom_number & 1の一部のインスタンスでは同じテストが失敗することに注意してください。
統計的な問題は下位数ビットをはるかに超えて広がっており、切り捨てられた場合でもPractRandテストに失敗し[22]、ビットが反転された場合でもBigCrushの複数のテストに失敗します[23] 。
初期化
xoshiro の論文では、初期化されたジェネレータとは根本的に異なるジェネレータを使用してジェネレータの状態を初期化することが推奨されています。また、シフトレジスタジェネレータの場合、この状態から抜け出すことは不可能です。[17] [24]著者は、次のように 64 ビットシードから SplitMix64 ジェネレータを使用することを特に推奨しています。
#include <stdint.h>
構造体splitmix64_state { uint64_t s ; };
uint64_t splitmix64 ( struct splitmix64_state * state ) { uint64_t result = ( state -> s += 0x9E3779B97f4A7C15 ); result = ( result ^ ( result >> 30 )) * 0xBF58476D1CE4E5B9 ; result = ( result ^ ( result >> 27 )) * 0x94D049BB133111EB ; return result ^ ( result >> 31 ); }
構造体xorshift128_state { uint32_t x [ 4 ]; };
// 他のジェネレーターでも同じことができます
void xorshift128_init ( struct xorshift128_state * state , uint64_t seed ) { struct splitmix64_state smstate = { seed };
uint64_t tmp = splitmix64 ( & smstate );状態-> x [ 0 ] = ( uint32_t ) tmp ;状態-> x [ 1 ] = ( uint32_t )( tmp >> 32 );
tmp = splitmix64 ( & smstate ); state -> x [ 2 ] = ( uint32_t ) tmp ; state -> x [ 3 ] = ( uint32_t )( tmp >> 32 ); }
参照
注記
- ^ C および他のほとんどの C ベースの言語では、 はビット単位の XOR
^を表し、および はビット単位のシフトを表します。<<>>
参考文献
- ^ abc Marsaglia, George (2003年7月). 「Xorshift RNGs」. Journal of Statistical Software . 8 (14). doi : 10.18637/jss.v008.i14 .
- ^ Brent, Richard P. (2004 年 8 月). 「Marsaglia の Xorshift 乱数ジェネレータに関する注記」. Journal of Statistical Software . 11 (5). doi : 10.18637/jss.v011.i05 . hdl : 1885/34049 .
- ^ ab Panneton, François; L'Ecuyer, Pierre (2005 年 10 月). 「XOR シフト乱数ジェネレータについて」(PDF) . ACM Transactions on Modeling and Computer Simulation . 15 (4): 346–361. doi :10.1145/1113316.1113319. S2CID 11136098.
- ^ 和田維作。 「良い乱数・悪い乱数」。2023-08-28に取得。パラメータは(7,9)と(9.7)のみです。
- ^ abcd Lemire, Daniel; O'Neill, Melissa E. (2019 年 4 月). 「Xorshift1024*、Xorshift1024+、Xorshift128+、および Xoroshiro128+ は線形性の統計テストに不合格」.計算および応用数学. 350 : 139–142. arXiv : 1810.05313 . doi :10.1016/j.cam.2018.10.019. S2CID 52983294.
これらのスクランブルされたジェネレーターは、各 64 ビット ワードから逆順に 32 の最下位ビットを取得するときに、Big Crush (具体的には線形性を検出する線形複雑度テストと行列ランク テスト) に体系的に不合格になることを報告します。
- ^ 「ISO/IEC 60559:2020」。ISO。
- ^ Le Floc'h, Fabien (2011年1月12日). 「XORWOW L'ecuyer TestU01 Results」. Chase The Devil (ブログ) . 2017年11月2日閲覧。
- ^ 「cuRAND テスト」。Nvidia。2017年 11 月 2 日閲覧。
- ^ abc Vigna, Sebastiano (2016 年 7 月). 「Marsaglia の xorshift ジェネレーターのスクランブルの実験的調査」(PDF) . ACM Transactions on Mathematical Software . 42 (4): 30. arXiv : 1402.6246 . doi :10.1145/2845077. S2CID 13936073. 最後に定数による乗算を追加する xorshift* ジェネレータを提案します。
- ^ ab O'Neill, Melissa E. (2014 年 9 月 5 日). PCG: ランダム数生成のためのシンプルで高速、スペース効率に優れた統計的に優れたアルゴリズムのファミリー(PDF) (技術レポート).ハーベイ・マッド・カレッジ. pp. 6–8. HMC-CS-2014-0905.
- ^ Press, WH ; Teukolsky, SA ; Vetterling, WT; Flannery, BP (2007). 「セクション 7.1.2.A. 64 ビット Xorshift メソッド」。Numerical Recipes: The Art of Scientific Computing (第 3 版)。 ニューヨーク: Cambridge University Press。ISBN 978-0-521-88068-8。
- ^ abc Vigna, Sebastiano. 「xorshift*/xorshift+ ジェネレーターと PRNG シュートアウト」。2014 年 10 月 25 日閲覧。
- ^ 斉藤睦夫、松本誠 (2014)。「XORSHIFT-ADD (XSadd): XORSHIFT の変種」 。2014年 10 月 25 日閲覧。
- ^ ab Vigna, Sebastiano (2017 年 5 月). 「Marsaglia の xorshift ジェネレーターのさらなるスクランブリング」(PDF) . Journal of Computational and Applied Mathematics . 315 (C): 175–181. arXiv : 1404.0390 . doi :10.1016/j.cam.2016.11.006. S2CID 6876444. XSadd の一般化である xorshift+ ジェネレータについて説明します。
- ^ ab チャブック、ウムット・カン;アイディン、オメル。ダルキリッチ、ギョクハン (2017)。 「軽量認証プロトコル用の乱数ジェネレーター: xorshiftR+」。トルコの電気工学およびコンピュータサイエンスのジャーナル。25 : 4818–4828。土井:10.3906/elk-1703-361。
- ^ Vigna, Sebastiano. 「xoshiro/xoroshiro ジェネレーターと PRNG シュートアウト」 。2019年 7 月 7 日閲覧。
- ^ ab Blackman, David; Vigna, Sebastiano (2018). 「スクランブル線形疑似乱数ジェネレーター」。データ構造とアルゴリズム。arXiv : 1805.01407。
- ^ ab 「xoshiro / xoroshiro ジェネレーターと PRNG シュートアウト」。2023年 9 月 7 日閲覧。
- ^ O'Neill, ME (2018-05-05). 「Xoshiro256** の簡単な説明」. PCG、より優れた乱数ジェネレーター。2024-10-04閲覧。
- ^ ブラックマン、デビッド、ヴィグナ、セバスティアーノ (2018)。「スクランブル線形疑似乱数ジェネレーター」。arXiv : 1805.01407 [ cs.DS]。
- ^ ab Blackman, David; Vigna, Sebastiano (2018). 「xoroshiro128+ のオリジナル C ソースコード実装」2018 年5 月 4 日閲覧。
- ^ 「xoroshiro は切り捨てられると PractRand に失敗する」 2020年. 2020年12月30日閲覧。
- ^ 「Xorshift128+ 乱数ジェネレーターが BigCrush で失敗する」 2020 年. 2020 年12 月 30 日閲覧。
- ^ 松本誠; 和田伊作; 倉本愛; 芦原兵 (2007 年 9 月). 「擬似乱数生成器の初期化における一般的な欠陥」. ACM Transactions on Modeling and Computer Simulation . 17 (4): 15–es. doi :10.1145/1276927.1276928. S2CID 1721554.
さらに読む
- ブレント、リチャード P. (2006 年 7 月)。「シフトと XOR を使用した長期乱数ジェネレーター」。ANZIAMジャーナル48 : C188–C202。 4 つのシフト (フィードバック ワードごとに 2 つ) を持つさまざまなサイズのジェネレーターを一覧表示します。
外部リンク
- Vigna, Sebastiano (2018). 「xoshiro / xoroshiro ジェネレーターと PRNG シュートアウト」2018 年 5 月 4 日閲覧。
