2012-05-19 4 views
5

:もかなり小さいLEN(x)のためにそのPythonのrandom.shuffle制限

注、 の総数xの順列は、ほとんどの乱数発生器の周期よりも大きい; ジェネレータ;これは、長いシーケンスのほとんどの並べ替えが が生成されないことを意味する。

この制限は乱数発生器に依存するように見えるため、これはどの言語でも当てはまりますか?任意の長いリストの置換を可能にする関数を書くことは可能ですか?

+0

「可能」ではないことを「実行可能」とします。 –

+0

私は実現可能だったが、現実的ではないが、今は私が好奇心が強いが、可能である、何の狂気について話しているのだろうか? – Colin

+4

http://stackoverflow.com/questions/3062741/maximal-length-of-list-to-shuffle-with-python-random-shuffleおよびhttp://mail.python.org/pipermail/python-dev/を参照してください。 2006年6月/ 065815.html(スレッドに従ってください、あまり深刻ではないにしても、本当の問題です)。 – TryPyPy

答えて

3

http://mail.python.org/pipermail/python-ideas/2009-March/003670.htmlを参照してください。問題が始まる正確な長さはPRNGに依存しますが、基本的な問題は常に適用されます。

@TryPyPyにリンクされている前の質問はPythonにも焦点を当てていますが、受け入れられた答えではなぜそれがいつも起こるのかがよく説明されています。 、言い換えするには、この方法で作業ナイーブシャッフルアルゴリズムを想像することができます:入力

  • のすべての可能な順列の、

    1. は、リストを生成し、pあなたのPRNG
    2. から乱数、xをゲットリストをシャッフルpはPRNGが生成できることを長いすべての可能x秒のリストを超える場合、順列の一部が到達不能ですp[x]

    です。

    ファンシーシャッフルアルゴリズムは、可能なすべての順列を生成する必要なく、その中核をなすものであるため、1つ以外のすべてを破棄する前に、真のランダム性のソースを持つ唯一の方法があります。

  • 2

    はい、可能です。すべての決定にrandom.SystemRandomを使用するパーミュテーションジェネレータを書くことができます。

    これは、オペレーティングシステムが使用するエントロピーをより多く収集している間に、プログラムが任意に長時間停止しなければならないという欠点があります。