2016-12-06 4 views
6

シャッフル時にリスト内の各変数がリストの新しい場所に配置されるようにリストをランダムにシャッフルしたいと思います。私は現在やっている何をPython:各変数が新しい場所に入るリストをランダムにシャッフルする方法

:この方法で

list = ['a', 'b','c', 'd']; 
random.shuffle(list) 

list 
['c','b','d','a'] 

私はリストをシャッフルするが、この場合「B」内の同じ場所に変数終わりを持つことは可能です。

マイ所望の出力

完全シャッフルリスト

['c','a','d','b'] 

私は任意の助けに感謝。私はPythonには新しいですが、それ以上の情報が必要な場合はお知らせください。このような

+3

リストがあることが予想されてどのように大きな?大ざっぱに言えば。 –

+0

@matiaselgart私のリストには15の変数が含まれます。 – Dre

+4

ちょうど注記:各要素を本当にランダムな位置にしたい場合は、すべての要素を移動しない配置を拒否すると、実際には「ランダム性」が減少します。任意のランダムな配置を任意に拒否することがより正確/安全である状況は非常にまれです。要素が同じ位置を維持できないようにすると、完全にランダムにシャッフルさせるよりも_more_情報が明らかになります。 – ShadowRanger

答えて

4

何かが欲しいものを行う必要があります。

import random 
import copy 

def super_shuffle(lst): 
    new_lst = copy.copy(lst) 
    random.shuffle(new_lst) 
    for old, new in zip(lst, new_lst): 
     if old == new: 
      return super_shuffle(lst) 

    return new_lst 

例:

In [16]: super_shuffle(['a', 'b', 'c']) 
Out[16]: ['b', 'c', 'a'] 
+0

このコードを['a'、 'b'、 'c'、 'd'、 'e'、 'f']の入力リストで何度も実行しました。 。 –

+1

これはおそらく最良のアプローチです。平均で約1/e(約37%)の並べ替えは、リストサイズとは無関係に、誤解であるため、ヒットする前にあまりにも多くの試行を経る必要はありません。 –

+0

@John Colemanありがとうございました。更新しました。 – Jack

関連する問題