ランダム変量生成アルゴリズムのテスト


回答:


9

筋金入りのテストスイートは、乱数発生器をテストするための黄金の標準に近いものです。これには、テスト済みのジェネレーターを使用した結果を比較できる既知の分布に従って、優れた乱数ジェネレーターが結果を生成する多くのテストが含まれます。

編集

正確ではなかったため、これを更新する必要があります。Diehardはまだ多く使用されている可能性がありますが、メンテナンスされておらず、最先端ではありません。それ以来 NISTは一連の改善されたテストを考案しました。


9

Honkの答えに少し付け加えると、Diehard Test Suite(George Marsagliaが開発)はPRNGの標準テストです。

これらのテストにアクセスできる素晴らしいDiehard Cライブラリがあります。標準のDiehardテストと同様に、ビット順序のチェックを含む(特に)いくつかの他のPRNGテストの機能も提供します。RNGの速度をテストし、独自のテストを作成するための機能もあります。

呼ばれるDieharderライブラリへのRインターフェース、ありRDieHarderは

library(RDieHarder)
dhtest = dieharder(rng="randu", test=10, psamples=100, seed=12345)
print(dhtest)

Diehard Count the 1s Test (byte)

       data:  Created by RNG `randu' with seed=12345, 
              sample of size 100 p-value < 2.2e-16

これは、RANDU RNGジェネレーターが最小距離/ 2dsphereテストに失敗したことを示しています。


8

乱数ジェネレーターによって生成された数値をテストするには、Diehardテストが実用的なアプローチです。しかし、これらのテストは一種arbitrary意的であり、さらにテストを含めるべきか、実際にランダム性をチェックする方法があるのか​​疑問に思われるかもしれません。

ランダムシーケンスの定義の最適な候補は、Martin-Löfのランダム性のようです。この種のランダム性の主なアイデアは、Knuthのセクション3.5で美しく開発されており、乱数のシーケンスのすべてのタイプのサブシーケンスの均一性をテストすることです。すべてのタイプのサブシーケンス定義を正しく取得することは、計算可能性の概念を使用する場合でも非常に困難であることが判明しました。

Diehardテストは、考えられる可能性のあるサブシーケンスの一部に過ぎず、それらの失敗はMartin-Löfのランダム性を除外します。


4

それは不可能だからです。恥ずかしい自己相関や分布の乱れがないかどうかを確認することしかできません。実際、Diehardはその標準です。これは統計/物理学のためであり、暗号作成者はまた、(特に)ジェネレーターをデータに適合させて将来の値を取得するのがどれだけ難しいかを主にチェックします。


4

Colinの投稿に対する小さな修正:CRANパッケージ RDieHarderは、DieHarderへのインターフェース です。Diehardの最近の貢献により、Robert G. Brown(私のRDieHarderラッパーに基づいて共著者として親切にリストされています)によって行われたDiehardの書き換え/拡張/オーバーホールです。

特に、DieHarderには、Markの投稿で言及されたNISTの一連のテストといくつかの新しいテストが含まれています。これは現在進行中の研究であり、しばらく前から行われています。useRで講演しました!ここから入手できるRDieHarderについて2007年。


3

アブストラクトで何かが「ランダム」であると結論付けるのはめったに役に立ちません。多くの場合、特定の種類のランダム構造を持っているかどうかをテストする必要があります。たとえば、ある範囲内のすべての値が均等に分布する可能性がある均一な分布があるかどうかをテストできます。または、正規分布などがあるかどうかをテストすることもできます。データに特定の分布があるかどうかをテストするには、カイ二乗検定やコルモゴロフ-スミルノフ検定などの適合度検定を使用できます。


3

乱数ジェネレーターのテストには2つの部分があります。均一なジェネレーターのテストにのみ関心がある場合は、はい、DIEHARDテストスイートのようなものをお勧めします。

しかし、多くの場合、均一なジェネレーターの変換をテストする必要があります。たとえば、均一なジェネレータを使用して、指数分布または正規分布の値を作成できます。高品質のユニフォームジェネレーター(Mersenne Twisterなどの有名なアルゴリズムの信頼できる実装があるとします)がありますが、変換された出力が適切な分布を持っているかどうかをテストする必要があります。その場合、コルモゴロフ-スミルノフなど、何らかの適合度テストを行う必要があります。しかし、まず最初に、サンプルの平均と分散が期待する値を持っていることを確認できます。

ほとんどの人は、独自の均一な乱数ジェネレータをゼロから作成しませんし、すべきではありません。良いジェネレーターを書くのは難しく、そうでないときでも自分が良いものを書いたと思い込ませるのは簡単です。たとえば、ドナルドクヌースは、彼が書いた乱数生成器のTAOCP第2巻で、ひどいことが判明した話を語っています。しかし、新しいディストリビューションからランダムな値を生成するために、独自のコードを記述する必要があるのは一般的です。


2

NISTは、統計テストのリストを公開して Cのリファレンス実装で

TestU01もあります尊敬されているPRNG研究者Pierre L'Ecuyerを含む、何人かの賢い人々によるます。繰り返しますが、Cにはリファレンス実装があります。

他のコメンターが指摘したように、これらは擬似ランダムビットの生成をテストするためのものです。これらのビットを別のランダム変数に変換する場合(たとえば、均一から標準へのBox-Muller変換)、変換アルゴリズムの正確性を確認するために追加のテストが必要になります。

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