FortunaまたはMersenne Twisterは、アルゴリズムRNGとして望ましいですか?


19

最近の回答では、モンテカルロシミュレーションをシードするためにFortunaまたはMersenne Twister Random Number Generators(RNG)を使用することに言及しました。フォーチュナのことを聞いたことがなかったので調べてみたところ、主に暗号化の使用を目的としているようです。

現在、実動コードでMersenne Twisterを使用してK-Meansアルゴリズムをシードしています。

「FortunaまたはMersenne Twister」は、「アルゴリズムシード」​​アプリケーション(モンテカルロとK-Meansのシードなど)に最適と見なされますか?または、それは「投げる」-つまり最も便利なものを使用します。

私が座っているところから、「最高」は最高品質の乱数を提供し、迅速に動作し、(おそらく)メモリのフットプリントが小さいはずです。これらのうち、おそらく品質は私たちのほとんどにとって最も重要です。


6
暗号化PRNGは、他のほとんどのPRNGよりもかなり遅い傾向があります。PRNG操作が数百万件となるモンテカルロシミュレーションを実行している場合、暗号化手法は非常に高価であることがわかります。
JM

1
@JM-もう少し詳しく言えば、あなたのコメントが答えとして良いと思います。最新のハードウェアアクセラレーションされた暗号化機能を使用して、暗号的に安全な擬似乱数の高性能ストリームを作成できるかどうかを確認することは確かに興味深いでしょう。
マークブース

ゆっくりしている暗号のRNGについて@JMの良い点-フォーチュナに対するマークは
winwaed

HERESにPRNGの、多くの異なる統計の良いリストは、あなたはそれが役立ちます便利な希望を>見つけることがboost.org/doc/libs/1_48_0/doc/html/boost_random/...
pyCthon

cstdlibでの私の問題は、粒度- RAND_MAX=32768可能な値のみでした。現在、モンテカルロレイトレーシングシミュレーションにMTを使用しています。ただし、MTがプロファイラーのパフォーマンスのボトルネックとは見なされません。おそらく、前処理として光線の方向などの「ランダムな」生成を行うからです。たとえば、起動時に100,000の光線の配列を生成し、それらを配列に保存し、実行時にランダムに配列の開始位置を選択します(コレクションの10,000光線程度で実行)。これは、適切な乱数分布と引き換えに、比較的高いメモリオーバーヘッドを持ちます。
ボボボボ

回答:


14

まあ、すべては何らかの種類のトレードオフです。乱数ジェネレーターの場合、それらを3つの基本的なカテゴリーにグループ化します。

  1. 宿題には十分です。
  2. あなたの会社を賭けるのに十分です。
  3. あなたの国を賭けるのに十分です。

線形合同PRNG(ほとんどのライブラリで一般的に実装されている方法)はカテゴリ1にしっかりとあります。FortunaとMersenne Twisterは両方ともカテゴリ2にしっかりとあります。

シャッフルアルゴリズムを台無しにすると企業/カジノにどのようなコストがかかるかに関する興味深い記事については、1999年のこの記事をお勧めします。リンクの腐敗により、画像はなくなっていますが、図4は、PRNGから次の番号を生成された以前の番号に対してプロットしたもので、平行線のセットです。

JMが指摘するように、Fortunaは遅いです。ご指摘のとおり、Mersenne Twisterはかなり高速です。


2
記事の印刷可能なバージョンをすばやくざっと見ると、「図4」は写真ではなくコードのようです。「図5」はカプットに見えますが、これWayBack Machineから取得した画像です。
JM

ありがとう。この場合、速度がフォルトゥーナに対するマークであるように見えます。Re。悪いシャッフル:はい、私は十分に知っています(あまりない!)、たとえば、悪い開始シードを選択することで、RNGのランダム性を簡単に「元に戻す」ことができます。
winwaed

より良い写真のある別のバージョンは次のとおり
download

1
32ビット出力の96ビットLCGは、Mersenne Twistersよりも多くの統計テストに合格します。意味のあるすべての点でMTよりもはるかに優れた適切な非暗号化PRNGを簡単に作成できることを考えると、誰もMersenne Twisterを使用するべきではありません。
-Veedrac

4

「暗号化」カテゴリのデフォルトの選択肢はBlum-Blum-Shubです。ウィキペディアのページで既に述べているように、これはあまりにも遅すぎるため、シミュレーションには適していません。

Unixライクなシステムで実行している場合は、/ dev / urandomから直接乱数を取得することを検討することもできます。これは、(必ずしも暗号ではありませんが)良質の乱数を提供するオペレーティングシステムサービスです。使用している特定のOSに応じて、これはYarrowアルゴリズムを使用する場合があります-Fortunaはその変形です。しかし、最も興味深い側面は、オペレーティングシステムがいくつかの真の乱数にアクセスできることです。たとえば、内部温度センサーからの熱ノイズです。通常、このデータは、データを予測不能に保つために使用可能になるたびにランダムプールに混合されます。

ランダムに混合するというこの概念は、次のように両方の世界のベストを得ることができるかもしれないことを示唆しています。基本的なRNGとして、Mersenneなどの高速で適度に良質な乱数ジェネレーターを使用します。同様に、2番目のより良い品質の乱数ジェネレーター(Fortunaなど)を維持します。25個などの非常に多くの数値が、より良いRNGの1回の反復を実行し、結果を基本RNGの状態に追加します。これにより、かなり高いパフォーマンスとかなり高い品質の結果が得られます。(この複合ジェネレーターの強度は、最も弱いリンクの強度になる可能性があるため、暗号化には役に立たないと思います。しかし、通常、悪意のある敵がいないシミュレーションでは機能します。)


/ dev / urandomは、Linuxおよびfree-bsdでの暗号化に安全に使用できます。この答えを見てください
アダムKurkiewicz

シミュレーションの場合、乱数が真であることが望ましいのはなぜですか?確かに、いくつかの擬似乱数ジェネレーターはより悪いですが、他のものはすべての実用的な目的のために同等です。それで、なぜあなたは真実を本質的に良い機能と考えているのですか?
Wrzlprmft

2

私は最近、このプロセスをシミュレーションで行ったと言いたいと思いましたが、本当に必要な場合、Fortunaの使用は問題ではないことに注意してください。私たちのケースでは、MTのエントロピーがシミュレーションでバイアスに変換されるほど高くないことを懸念していました。そのため、シミュレーションでは、そのアルゴリズムから約650億個の乱数を引き出すFortunaを使用しました。要するに、コンピューターは高速です。本当に必要な場合は、理由がある場合に使用できます。もしモンテカルロ統合のようなことをしているだけなら、MTに固執してください。


0

答えは、RNGを使用する予定のアプリケーションに大きく依存すると思います。Tangurenaの大まかな分類には、4番目のカテゴリを提案します。

多くのアプリケーションにとって、それは単に問題ではないかもしれません。適切に暗号化グレードのRNGは、妥当性を同等に高めることなく、単にタスクを遅くするかもしれません。たとえば、私が行う研究の多くは、指定した分布から大まかに来る数百万の数を必要とします。ほとんどすべてのRNGで十分であるため、必要なのは、RNG としての価値がないほど致命的なほど貧しくはないものだけです。それ以外のものは、単に不必要に作業を遅くしているだけです。私はMersenne Twisterを使用する傾向がありますが、それは単にそれが十分に機能するためであり、コードがあり、それはかなり高速です。

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