最近私は、64ビットinteger
(またはlong
)のMersenneTwisterを実装しました。私の実装が十分な解決策であるかどうかを知るためにPRNGをテストするためのガイドまたは例がありますか?私の実装が十分に均一な分布をしているかどうかを検証する方法には特に興味があります。PRNGをテストするには?
より具体的には、これはメルセンヌに結び付けられています。
最近私は、64ビットinteger
(またはlong
)のMersenneTwisterを実装しました。私の実装が十分な解決策であるかどうかを知るためにPRNGをテストするためのガイドまたは例がありますか?私の実装が十分に均一な分布をしているかどうかを検証する方法には特に興味があります。PRNGをテストするには?
より具体的には、これはメルセンヌに結び付けられています。
あなたはメルセンヌツイスターアルゴリズムテストする必要はありません - あなただけが正しくが実装しましたかどうかをテストする必要があります - それは本当に彼らがやっていることを知っている人で何度も行われていますがアルゴリズム。
Mersenne Twister web siteにアクセスし、test outputを取得できます。同じ出力シーケンスを生成する場合は、アルゴリズムを正しく実装している可能性があります。
MTサイトには、具体的には64 bit machinesのリンクがあり、32および64ビットバージョンのテスト出力が異なることに注意してください。
PRNGの標準テストバッテリはDiehard Testsです。
[TestU01](http://www.iro.umontreal.ca/~simardr/testu01/tu01.html)優れています。 –
最も簡単なアプローチ(本当に一般的なMTの場合)は、同じシードの既知の良きMTライブラリと比較することです。
それはそうですが、2つの問題があります。私はMT-64ライブラリを1つだけ知っていますが、テストに必要なすべての機能を備えていません(nextDnt、nextIntFromRangeなどを実装している間にnextIntを提供します)。 IIRCでは、MT-64とMTの生成シードに違いがあります。そのため、2番目のライブラリ(すべての機能が不足しています)を使用してそのようにチェックすることはできません。 –
アロハ!
誰か他の人が言ったように、アルゴリズムに既知の回答テストベクトルを使用します。テストベクタを満たしていれば、ジェネレータが動作することを合理的に確信できます。
実際にジェネレータをテストする場合は、 Dieharderツールによって実装された++ DIEHARDテストを使用します。
それにはちょっとした問題があります。 Cは符号なし64ビット整数を使用します。私の知る限りでは、Javaは実際には「long」の符号なしではありません。このように生成された非負の 'long'がすべて同じで、同じ順序付けをしていれば両方の実装が同じであると仮定するのは安全でしょうか? –