Pythonがリスト(List)のソートをランダムに乱す方法

1722 ワード

シーン:
今list:[1,2,3,4,5,6]があります.このlistを出力するときは、ランダムに乱す形で出力する必要があります.
専門点の用語:1つのコンテナ内のデータをランダムに1回ずつ巡回します.
注:ランダムなリストセットを生成するわけではありません.
環境:
Python 3.6
ソリューション:
シナリオ1:
Randomに関数を内蔵することで、意図した結果を間接的に実現する人もいるかもしれません.しかし、この方式は、あまりにも原始的で、優雅ではなく、車輪を繰り返す疑いがある.ここで私はrandomで実現した効果を貼らない.
シナリオ2:
Randomにrandomがあるshuffle()メソッドは、完璧なソリューションを提供します.コードは次のとおりです.
x = [1,2,3,4,5,6]
random.shuffle(x)
print(x)

出力結果:
       :[6, 5, 1, 3, 2, 4]
       :[6, 1, 3, 5, 2, 4]
       :[5, 3, 1, 2, 4, 6]

結果から,出力は完全にランダムであり,コード量は2行でありrandomは必要なく,forループは必要ないことが分かった.
ソースの解読:
このセクションの原文リンク:Pythonでリストの順序を乱すrandom.shuffle()の使い方
def shuffle(self, x, random=None):
    """Shuffle list x in place, and return None.
          ,       。

    Optional argument random is a 0-argument
    function returning a random float in [0.0, 1.0); 
    if it is the default None, 
    the standard random.random will be used.
	    random    0      ,  [0.0,1.0)      ;
	  random    None,       random.random()。
    """

    if random is None:
        randbelow = self._randbelow
        for i in reversed(range(1, len(x))):
            # pick an element in x[:i+1] with which to exchange x[i]
            j = randbelow(i + 1)
            x[i], x[j] = x[j], x[i]
    else:
        _int = int
        for i in reversed(range(1, len(x))):
            # pick an element in x[:i+1] with which to exchange x[i]
            j = _int(random() * (i + 1))
            x[i], x[j] = x[j], x[i]


注:コードの注釈から、random.shuffle()は元のlistを変更していることがわかります.元のlistを保持する必要がある場合は、この詳細に注意してください.本文はBigYoung小駅で先発した.