多くの人が知っているように、PythonはMersenne Twister(MT)アルゴリズムを使用して乱数を処理します。ただし、非常に長い期間(〜2 ^ 19937)があるにもかかわらず、2080要素を超えるシーケンスをシャッフルすると(!2081> 2 ^ 19937)、すべてのランダム順列に到達できないこともよく知られています。私は順列を扱っており、統計的特性は私にとって重要であるため、繰り返しを避けるために、Pythonジェネレーターを追加のランダム性のソースと混合または再シードする最良の方法を見つけようとしています。
現在、私のコンセプトは、システム乱数ジェネレーター(SystemRandom)を使用して、MTジェネレーターに外部のランダム性のソースを追加することです。これを行うために私が考えることができる2つの方法があります:
- SystemRandom乱数とMT乱数のXOR
- SystemRandomを使用してMTを再シードします
最初のアプローチは、バイアス傾向を減らすために、ハードウェア乱数ジェネレーターによってある程度の頻度で使用されます。ただし、これは非常に非効率的です。Windows XPマシンでは、SystemRandomは標準のPythonランダム関数よりも50倍遅くなります。ほとんどの関数がシャッフルを伴う場合、これはパフォーマンスに大きな打撃を与えます。それを考えると、SystemRandomを使用してMTを再シードすると、大幅に効率が向上するはずです。
ただし、そのアプローチにも2つの問題があります。まず、操作中にMTを再シードすると、その統計的特性が損なわれる可能性があります。MT値の各実行は(開始点に関係なく)整形式である必要があるため、MTが十分に長く実行されれば、これは問題にならないはずです。ただし、MTの再シードの間にかなりの期間が望ましいことを示しています。第二に、再シードをトリガーする最も効率的な方法は何かという問題があります。これを処理する最も簡単な方法は、カウンターを使用することです。ただし、より効率的な方法が可能かもしれません。
したがって、この点について3つの質問があります。
- N個のサンプルごとにランダムな値でMTを再シードすると、その望ましい統計的特性が変わるという趣旨の何かを読んだ人はいますか?
- カウンターをインクリメントして再シードをトリガーするよりも効率的な方法を知っている人はいますか?
- 最後に、この問題に取り組むための一般的により良い方法を誰かが知っているなら、私はすべての耳です。