WELL疑似乱数生成


8

私はMT19937テストハーネスで使用して、一様に(符号なし)32ビット[0、232-1]値は、元の作者のmt19937.c実装に基づいており、統計的にランダムなビットオクテットストリームの(本質的に無尽蔵)供給を生成します。これは、これらの特定のテストに必要ではないCSPRNGの代わりです。しかし、私は最近WELLPRNGを検討しています-統計的性質自体(どちらも私のニーズに十分すぎるように思われる)のためではありませんが、より効率的な実装を提案しているようです。

私は学術論文の数学的背景が足りませんが、少なくとも前者の「ねじれ」行列と焼戻し変換に従うことができました。ただし、WELL-n関数の作成者が提供するコードの多くは、いくつかの魔法の浮動小数点定数(例:)を使用して、浮動小数点生成に焦点を当てているようです2.32830643653869628906e-10WELLコードからステップを省略して、32ビットの均一な配布を提供できますか?または、アルゴリズムは特に浮動小数点分布用に設計/バイアスされていますか?

またはWELL、要件を満たしながら、「バルク」uint32ベクトル生成のパフォーマンス向上をもたらすと考えるのは間違っていますか?


1
これが好奇心だけの場合は問題ありませんが、実際のパフォーマンスは常に他の状況によって異なります。乱数の生成が合計時間の10%を消費し、半分に減らすことができる場合、5%のスピードアップが得られますが、これは問題に値しないかもしれません。
Mike Dunlavey、2014

おそらくトピック外ですが、必要なメモリがはるかに少なく、簡単に並列化できるdeshawresearch.com/resources_random123.htmlなどのカウンターモードジェネレーターを検討する価値もあります。
ジェフリーアービング

1
更新として、今はPCGRNGに傾いています。それらははるかに高速で、統計的に優れた特性を備えた非常に長い期間(および複数のストリーム)を供給でき、貧弱なIVから非常に迅速に回復するように見えます。
ブレットヘイル

回答:


4

乱数ジェネレーターのほとんどのユーザーは、最終的には浮動小数点値に関心があると思います。これが、倍精度のSIMD指向の高速メルセンヌツイスター(dSFMT)が存在する理由です。ただし、値を返すWELL RNGの新しいCコードがありunsigned longます。コードを見ると、以前のバージョンがキャストunsigned longしていたdoubleように見えるので、2つを比較することで彼らが何をしていたかを理解できるかもしれません。

主に速度を気にしているのであれば、これはあなたにとってPRNGだとは思わない。著者が言及する速度/パフォーマンスは、アルゴリズムがランダムな変量を生成する速さではなく、初期化不良から回復する速さです。これにより、WELLジェネレーターの統計特性が向上します。これの意味の詳細については、斉藤睦夫の修士論文(PDF)セクション6を参照してください。このようなテストは、人為的に最悪の場合の初期状態で実行されるため、一般的にどのような影響があるかはわかりません。

乱数の生成は非常にコストがかかる場合があり(多くの場合、直感にもかかわらず)、コードがランダムな値を生成するために適切な時間を費やしている場合、最適化の候補として非常に適しています。私自身の簡単なパフォーマンステスト(Retina MacBook Pro、OS X 10.9)では、値を生成するときに、WELL RNGが現在の整数ベースのSIMD指向の高速メルセンヌツイスター(SFMT)の約3分の1の速さであることがわかりました。もサポートしています。私はまた、古典見つけ程度とするコードを、高速の半分として。uint32SFMTuint64mt19937ar.cSFMT

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.