乱数の線形合同ジェネレーターの品質


14

さまざまな外力に対して、ランジュバン方程式のシミュレーションを行っています。Cのrand()from stdlib.hは私の結果にバイアスを導入する可能性があると言われ、私はMersenne Twisterを使用しています。

それにもかかわらず、線形合同発生器がシミュレーションでどのような種類の誤差を引き起こす可能性があるのか​​を正確に知りたい(そして見たい)。これらは私が試したものです:

  • ランダムの3Dタプルを生成して、超平面を表示しようとします。何も見えません。
  • 乱数の大きなベクトルのFFTを実行します。メルセンヌツイスターとの両方でほぼ同じですrand()
  • ブラウン運動の粒子の等分配原理の確認。両方のインテグレーターは、の期待値が同じ有効桁数でします。KE=12kBT
  • 累乗2ではないいくつかのビンにどれだけうまくビンが入っているかを確認します。どちらも同じ定性的な結果をもたらしますが、誰も優れていません。
  • Brownianパスを見て、からの明確な分岐を確認し。繰り返しますが、運はありません。バツ=0
  • 円内のポイントの分布。塗りつぶされ、境界内のみ。それらのすべての間、および最も近い隣人の間(Shorの答え、以下のコメント)。この gistで使用できます。必要なライブラリをインストールした後、Julia 0.5.0で実行します(手順についてはgistを参照してください)。

物理シミュレーションのコンテキストに導入されたバイアスを探していることを強調したいと思います。たとえばrand()、メルセンヌツイスターはテストしませんが、ダイハードテストは惨めに失敗しますが、現時点ではあまり意味がありません。

悪い乱数ジェネレーターがモンテカルロシミュレーションを破壊する方法について、物理的で具体的な例はありますか?

注:PRNGがいかにRANDUひどいものになるかを見てきました。私は、明白ではないが、無邪気に見えるが最終的にバイアスを導入するジェネレーターの例に興味があります。


1
要求された例はありませんが、自分のCプログラムでrand()/ srand()ではなくdrand48()/ srand48()を使用しています。それぞれのマニュアルページには、使用されているさまざまなprngアルゴリズムが記載されています(randのアルゴリズムについてはman randomを参照してください)。プラットフォーム間での移植性の再現性を保証したい場合は、Numeric Recipes in C、2nd Edition、WHPress、et al、Cambridge UP 1992、ISBN 0-521-43108-5、280ページからran1()をコーディングしました。わかりますが、定量的にテストしていません。

random()またはdrand48()/ lrand48()を使用します(分子動力学とモンテカルロシミュレーションには常に後者を使用しますが、かなり良いです)。また、ランダムシードを使用してみてください。これは、単一粒子のランジュバン方程式のシミュレーションには十分すぎるはずです。
ヴァレリオ

円ではなく円周を使用しました。

@PeterShor訂正していただきありがとうございます。私は答えを更新しましたが、それでも私は恐れていません。
RedPointyJackson

1
@DanielShapero randomおよびurandomは、キーの生成などの暗号化を目的とした、暗号的に安全なRNGであると想定されています。ハードウェアのそれの側面は、Linux上で、彼らは環境のエントロピーを使用し、それはハードウェアアクセラレーションと同じではないということです。それらは、モンテカルロシミュレーションのようなものをまったく意図していません。
キリル

回答:


3

不十分なRNGによる物理システムのモンテカルロシミュレーションの失敗を説明する興味深いリファレンスの1つは(LCGを使用しませんでしたが)です。

A.フェレンバーグとDPランダウ。モンテカルロシミュレーション:「良い」乱数発生器からの隠れたエラー。フィジカルレビューレター63(23):3382-3384、1992

FerrenbergとLanduaが研究したIsingモデルは、RNGの優れたテストです。これは、(2次元問題の)正確な解と比較し、桁のエラーを見つけることができるためです。これらのモデルは、従来の32ビット算術PMMLCGで障害をそれほど難なく表示する必要があります。

別の興味深いリファレンスは次のとおりです。

H.バウケとステファンメルテンス。擬似ランダムコインは、テールよりも多くのヘッドを表示します。arXiv:cond-mat / 0307138 [cond-mat.stat-mech]

BaukeとMertensは、バイナリリニアフィードバックシフトレジスタスタイルの乱数ジェネレーターに対して強い主張をしています。BaukeとMertensには、これに関連する他の論文がいくつかあります。

3D散布図でマルサグリア平面を見つけるのは難しい場合があります。プロットを回転させて見やすくすることもできますが、場合によっては表示されることもあります。統計的な均一性の3Dテストを行うこともできます。古い32ビットLCGの場合、これらは非常に少数のビンで失敗します。たとえば、3次元のビンの20x20x20グリッドを使用した均一性テストは、m = 2 ^ 31-1、a = 7 ^ 5で広く使用されている(かつて十分に評価されていた)PMMLCGの均一性の欠如を検出するのに十分です。


1

PRNGテストのTestU01スイートを使用し、これらのテストのどれrand失敗するかを調べることできます。(テストスイートの概要については、TestU01:乱数ジェネレーターの経験的テスト用ACライブラリを参照してください。)独自のモンテカルロシミュレーションを考えるよりも簡単です。ある意味では、それはソフトウェアの構成可能性(およびソフトウェアの正確さ)の問題でもあります。小規模で単純なテストで問題なく機能するように見えるPRNGを考えると、そのプログラムの病理学的挙動が大きなプログラムによってトリガーされないことをどのように知るのでしょうか?

コードは次のとおりです。

#include "TestU01.h"

int main() {
  // Same as rand() on my machine
  unif01_Gen* gen = ulcg_CreateLCG(2147483647, 16807, 0, 12345);

  bbattery_SmallCrush(gen);
  bbattery_Crush(gen);

  return 0;
}

ためSmallCrushのスイート、15のうち失敗3つの試験がある(参照 guidelongtestu01.pdf長い記述とすべての参照のためTestU01にし、これらは10回の試験から15件の統計情報です)。

  • n tdtdt1{j+1j}

  • n t[01tdt

  • nt[01バツnPバツ<バツ=バツtn=2×106t=6χ2<10300

これらはすべて「典型的な」モンテカルロシミュレーションであると想定しています(ただし、それらはあなたが考えていた問題とは異なる場合があります)が、結論は randそれらの未知のサブセットに失敗します。なぜそれが具体的にそのサブセットであるのかはわかりませんが、あなた自身の問題で機能するかどうかを言うことは不可能です。

説明が非常に単純であるため、MaxOftは特に疑わしいようです。

Crushスイートのテストのうち、rand140のうち51が失敗します(96のテストで140の統計)。失敗したテスト(Fourier3など)の一部はビット文字列で実行されるため、おそらく関連性がない可能性があります。失敗する別の奇妙なテストはGCDで、2つのランダムな整数のGCDの分布をテストします。(繰り返しますが、この特定のテストが失敗する理由や、シミュレーションがこれに苦しむかどうかはわかりません。)

PS:さらに注意すべきことrand()は、MRG32k3a(上記のL'Ecuyer&Simardの論文を参照)など、SmallCrushCrushBigCrushのすべてのテストに正常に合格したPRNGよりも実際に遅いことです。

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