6

非常に大きなランダムな数をどのように生成しますか?私は2^10 ^ 9(10億ビット)のオーダーを考えています。任意のプログラミング言語-ソリューションは他の言語に翻訳されると思います。

[1、N]に一様分布したいのですが。

私の最初の考え:

-各桁をランダムに生成して連結することができます。問題:非常に優れた疑似乱数ジェネレーターでさえ、数百万桁のパターンを開発する可能性がありますよね?

  • ランダムな数値をランダムな指数に上げることで、大きなランダムな数値を作成するのに役立つ可能性があります。問題:結果の数値がまだランダムになるように数学を機能させる必要があり、妥当な時間(たとえば、1時間)で計算できるはずです。

  • それが役立つ場合は、(たとえば実数を使用して)おそらくより狭い範囲でおそらく不均一な分布を生成して変換することを試みることができます。問題:これも同様に難しいかもしれません。

何か案は?

4

5 に答える 5

4

log2(N)ランダムビットを生成して数値を取得します。数値MM最大で2倍になる場合がありますNMが範囲内になるまで繰り返します[1;N]

ここで、ランダムビットを生成するには、コストのかかる真のランダム性のソースを使用できます。

または、暗号化された安全な乱数ジェネレーターを使用することもできます。たとえば、後続のビットブロックのカウンターを暗号化するランダムキーを備えたAESです。暗号的に安全であるということは、目立ったパターンがないことを意味します。

于 2011-03-27T07:27:59.183 に答える
2

それはあなたがデータを必要とするものに依存します。ほとんどの場合、PRNGは高速でシンプルです。しかし、それらは完璧ではありません。たとえば、カオスシステムのモンテカルロスシミュレーションは、PRNGの基本的なパターンを明らかにするのに非常に優れていると聞いたのを覚えています。

それがあなたがしているようなことなら、しかし、私が大学院でたくさんのランダムなデータを生成するために学んだ簡単なトリックがあります。大きな(できれば急速に変化する)ファイルを取ります。(実行中のカーネルからのいくつかのビッグデータ構造は適切です。)エントロピーを増やすためにそれを圧縮します。ヘッダーを捨てます。次に、適切な方法として、結果を暗号化します。これを暗号化の目的で使用することを計画している場合(そして、使用するための完全なエントロピーデータセットがなかった場合)、それを逆にして再度暗号化します。

基礎となる理論は単純です。情報理論によると、冗長性のない信号と純粋なランダムデータの間に違いはありません。したがって、大きなファイル(つまり、大量の信号)を選択し、圧縮によって冗長性を取り除き、ヘッダーを削除すると、かなり良いランダム信号が得られます。暗号化は、アーティファクトを削除するのに非常に優れています。ただし、暗号化アルゴリズムはブロック単位で機能する傾向があります。したがって、すべてにもかかわらず、誰かがファイルの先頭で何が起こっていたかを推測できれば、そのデータはより簡単に推測できます。ただし、ファイルを元に戻して再度暗号化すると、データ内のパターンを見つけるために、ファイル全体と暗号化を知る必要があります。

急速に変化するデータを選択する理由は、データが不足してさらに生成したい場合は、同じソースに戻ることができるためです。そのプロセスの後、小さな変更でさえ、本質的に相関のないランダムデータセットに変わります。

于 2011-03-27T16:04:51.360 に答える
1

NTL:数論を行うためのライブラリ

これは私の符号理論と暗号化の先生によって推奨されました...それで私はそれが正しく機能すると思います、そしてそれはかなり使いやすいです。

RandomBnd、RandomBits、RandomLen-疑似乱数を生成するためのルーチン

ZZ RandomLen_ZZ(long l);
// ZZ = psuedo-random number with precisely l bits,
// or 0 of l <= 0.
于 2011-03-27T07:18:17.123 に答える
0

Xビットの乱数を生成する乱数ジェネレーターがある場合。そして、[X1、X2、... Xn]の連結ビットは、各Xがランダムである限り、Nビットの必要な数を作成します。すべてのインテントで大きな数がランダムにならない理由はわかりません。と目的。また、標準のC rand()メソッドが十分に安全でない場合は、疑似乱数が「よりランダム」である他のライブラリ(このスレッドで言及されているものなど)がたくさんあると確信しています。

于 2011-03-27T07:23:06.890 に答える
0

非常に優れた疑似乱数ジェネレータでさえ、数百万桁のパターンを開発する可能性がありますよね?

疑似乱数生成に関するウィキペディアから:

PRNGは、シード状態を使用して任意の開始状態から開始できます。その後、その状態で初期化されると、常に同じシーケンスが生成されます。繰り返しを開始する前のシーケンスの最大長は、ビット単位で測定された状態のサイズによって決まります。ただし、最大期間の長さは「状態」の各ビットが追加されると2倍になる可能性があるため、多くの実用的なアプリケーションに十分な長さの期間を持つPRNGを簡単に構築できます。

ランダムな数値をランダムな指数に上げることで、大きなランダムな数値を作成するのに役立つ可能性があります

科学的記数法の値にランダムな値を入力するようなものを提案していると思いますか?

例えば:1.58901231 x 10^5819203489

これに伴う問題は、分布が対数になることです(または、その指数関数ですか?:)-同じ違いですが、均等ではありません)。100万桁目が設定されていても、1の列に1桁の数字が含まれている値を取得することはありません。

おそらくより狭い範囲で(たとえば実数を使用して)不均一な分布を生成し、変換することを試みることができます

よくわかりません。同じ問題で、指数解と同じように聞こえます。定数を掛けることについて話している場合は、対数(指数?)分布ではなく、ゴツゴツした分布になります。

推奨される解決策

良好な分布を持つ非常に大きな疑似乱数値が必要な場合は、より大きな状態のPRNGアルゴリズムを使用してください。PRNGの周期性は、多くの場合、ビット数の2乗であるため、非常に大きな数を埋めるのにそれほど多くのビット必要ありません。

そこから、最初のソリューションを使用できます。

各桁をランダムに生成して連結することができます

PRNGによって返される値の全範囲(おそらく2^31または2^32)を使用し、バイト配列にそれらの値を入力して、必要に応じて分割することをお勧めします。そうしないと、ランダム性のビットをたくさん捨ててしまう可能性があります。また、値を範囲にスケーリングする(またはモジュロを使用する)と、分布が簡単に台無しになる可能性があるため、PRNGが返すことができる最大ビット数を維持しようとする別の理由があります。ただし、返されたビットでいっぱいのバイト配列をパックするように注意してください。そうしないと、ディストリビューションに再びしこりが生じます。

ただし、これらのソリューションの問題は、その(通常よりも大きい)シード状態をランダムに十分な値で埋める方法です。標準サイズのシード(時間またはGUIDスタイルの母集団を介して入力)を使用して、大きいPRNG状態に小さいPRNGの値を入力できる場合があります。これは、番号がどれだけ適切に分散されているかがミッションクリティカルでない場合に機能する可能性があります。

真に暗号的に安全なランダム値が必要な場合、それを行う唯一の実際の方法は、http: //www.random.org/にあるような自然な形式のランダム性を使用することです。自然ランダム性の欠点は可用性であり、多くの自然ランダムデバイスが新しいエントロピーを生成するのに時間がかかるため、大量のデータを生成するのは非常に遅い場合があります。

ハイブリッドを使用して安全にすることもできます-自然ランダムシードのみ(生成の速度低下を回避するため)、残りはPRNGです。定期的に再シードしてください。

于 2011-03-27T07:33:05.453 に答える