非常に優れた疑似乱数ジェネレータでさえ、数百万桁のパターンを開発する可能性がありますよね?
疑似乱数生成に関するウィキペディアから:
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です。定期的に再シードしてください。