2016-08-10 18 views
0

私はリストa=[num1,num2,...,numn]を持っています。私はrandom.shuffle(a)でそれをシャッフルしています。しかし、私が機能として欲しいのは、入力としてキーを取るシャッフルアルゴリズムと、確定的に同じシャッフルを生成するキーの所有者です。Pythonでキー付きランダムシャッフル

私は、入力されたキーをシャッフルされる要素のシーケンスとし、そのキーに応じてそのランダムな並べ替えを出力するアルゴリズムが必要です。シャッフルを同じ入力シーケンスで同じキーを入力して再度適用すると、同じ結果が得られます。そうでなければランダムシャッフル。同じデータの同じキーで「シャッフルを解除」できます

これは可能ですか?

+1

'キーの所有者とは何ですか? 「決定論的に同じシャッフルを生み出す」とはどういう意味ですか? –

+0

ランダムではない乱数が必要ですか?それはあなたが求めていることですか? –

+0

@ 2ビットアルケミスト私は、入力されたキー、シャッフルされる要素のシーケンス、およびキーに応じてランダムな並べ替えを出力するアルゴリズムが必要です。シャッフルを同じ入力シーケンスで同じキーを入力して再度適用すると、同じ結果が得られます。そうでなければランダムシャッフル。同じデータの同じキーで「シャッフル解除」することができます – curious

答えて

2

擬似ランダム用語では、そのキーがシードと呼ばれ、あなたが新しいrandom.Random()インスタンス上でランダムシードを設定することができます。

def keyed_shuffle(x, seed=None): 
    random_obj = random.Random(seed) 
    random_obj.shuffle(x) 

あなたも直接random.seed()random.shuffle()を使用していますが、使用した可能性があり独自のrandom.Random()インスタンスは、randomモジュールが使用するシングルトンrandom.Random()インスタンスでシードを設定することを回避し、そのモジュールの他の用途には影響しません。

シードは、整数(直接使用される)でも、ハッシュ可能なオブジェクトでもかまいません。

デモ:

>>> a = [10, 50, 42, 193, 21, 88] 
>>> keyed_shuffle(a)  # no seed 
>>> a 
[42, 10, 88, 21, 50, 193] 
>>> a = [10, 50, 42, 193, 21, 88] 
>>> keyed_shuffle(a)  # again no seed, different random result 
>>> a 
[88, 50, 193, 10, 42, 21] 
>>> b = [10, 50, 42, 193, 21, 88] 
>>> keyed_shuffle(b, 42) # specific seed 
>>> b 
[193, 50, 42, 21, 10, 88] 
>>> b = [10, 50, 42, 193, 21, 88] 
>>> keyed_shuffle(b, 42) # same seed used, same output 
>>> b 
[193, 50, 42, 21, 10, 88] 
>>> c = [10, 50, 42, 193, 21, 88] 
>>> keyed_shuffle(b, 81) # different seed, different random order 
>>> c 
[10, 50, 88, 42, 193, 21] 
関連する問題