2016-05-06 23 views
1

私は辞書のキーである40.000のIDを持っています。シャッフルする必要があります(例えば、random.shuffle)。しかし、私はそのステップをスキップできますか?辞書のキーの順序をランダムな順列と見なすことはできますか?

ディクショナリにはキーが格納されていないので、keys = dict.keys()を入力すると、keysには昇順ではないキーが含まれます。私のプログラムは一度だけ実行されるので、 "順列の結果"が実行の間で同じかどうかは気にしません。

だから私はシャットダウンのステップをスキップしてスキップすることはできますか?


私は、キーの順序が少し予測可能であることを理解しています。

キーの順序と同じ(ずっと)であることをrandom.shuffle()によって生成された順列のチャンスが(大まかに)は何ですか?私は何を求めていますけれども、このですか

+1

辞書の順番はほとんどランダムではありません。あなたはそれに真のシャッフルを行うことによって、はるかに良い結果を得るでしょう。シャッフルのスピードは線形でなければならないので、パフォーマンスは問題ではありません。 –

+0

'辞書の順序はほとんどランダムではありません - それは未定義です。それについての説明がうまくいくかもしれません。 – gsamaras

+0

私は、ハッシュテーブルとハッシュ関数を読むことをお勧めします。あなたはおそらくハッシュバケットの順序でキーを取得しています。 –

答えて

2

いいえできません。

ランダム性が必要な場合は、辞書にデータを入力する前に、または後でシャッフルをスキップすることはできません。

辞書のキーの順序は保証されていませんが、エントリの順序に基づいて想定される順序については、予測可能性があります。

辞書のエントリは、非常に大きな数字であるキーのhashの値に従って行われ、もう1つの大きなモジュロを値にして、値の範囲を作成します。 2つのキーが同じ値にハッシュされると、collisionが発生します。

[編集]:
ハッシュバケットとほぼ同じオーダーでランダムにキーを取得するチャンスです。これは、次の利用可能な場所に配置されます(いずれかの方法で決定されます)。不確定。

2

他の人が何を言っているのか、なぜ実際にキーをシャッフルする必要があるのか​​を詳しく説明します。同じ方法で繰り返し辞書を初期化すると、毎回同じ順番になります。それは明らかにランダムではありません。 Masqueが言ったように、それはハッシュに基づいています(これはよく質問Why is the order in dictionaries and sets arbitrary?参照)。

"random.shuffle()によって生成された順列のチャンス(大まかに言えば)は、キーの順序と(ほぼ)同じですか?直接:シャッフルと同じ正確にはである確率は1/factorial(len(yourDict))です。その理由は、置換の1つが初期化時にあなたの辞書と同じ順序になるからです。しかし、他のすべての順序は異なりますが、シャッフルの結果として異なる順列(順序)があります(factorial(len(yourDict)))。

希望に役立ちます!

+1

曖昧さ:もし辞書が全部大きければ乱数ジェネレータをシードするための 'factorial(len(yourDict))'の可能性が低いでしょう。したがって、 'random.shuffle() '。この質問を参照してください:http://stackoverflow.com/q/34139259/4996248また、楽しみのため、これを参照してください:https://www.youtube.com/watch?v=T69cguFzZ_w –

+0

非常にクールです。しかし、OPは彼らが40,000個のIDしか扱っていないとし、擬似乱数ジェネレータの期間はPythonの '2 ** 19937-1'と述べています。だから彼らは長い間、安全でなければならない。 – rofls

+1

範囲(1,40001)内のnの合計(math.log(n、2))は553809と評価されますので、40000! 2 ** 553809のようなものです。また、シャッフルがシード時のシステムクロックの状態の関数であるようにシステムクロックによってシードされる場合、システムクロックの可能な状態の数は、4万回に比べてわずかです。 (またはその問題でさえ52!)、これは 'random.shuffle()'が数学的に可能なすべてのシャッフルの表面を傷つける以上のことをすることはできないことを示唆しているようです。 –

関連する問題