2016-12-21 10 views
1

random.shuffleに問題があります。基本的には、リスト内のアイテムを疑似ランダム化するためにはうまく動作しますが、私の場合は同じアイテムが同じ位置に残らないようにしたいと考えています。元の位置に残っているアイテムを避けながら、リスト内のアイテムをシャッフルする方法は?

すべての商品アイテムが新しいポジションになるように、このコードを作成しました。

match = True 
while match is True: 
    for i in range(len(initial_list)): 
     if initial_list[i]==result_list[i]: 
      random.shuffle(result_list) 
      match = True 
     else: 
      match = False 

このコードは(シャッフルを行うことができる場合)のテストに合格したが、それを行うには、より簡単&より高速な方法はありますか?

+10

なお:

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] 

同じ考えのわずかな変更では、我々はあなたの新しい要件に追加することができます'は、各要素が別の場所で終わることを確実にするアルゴリズムであるPRNGを使用しています。 – TigerhawkT3

+1

@ TigerhawkT3:確かに、見た目やサウンドがよりランダムなものは、ランダムではありません(http://muller.lbl.gov/teaching/Physics10/old%20physics%2010/chapters%20(old)/ 4-Randomness .htm) –

+2

http://dilbert.com/strip/2001-10-25 –

答えて

7

random.shuffleactual implementationは非常に簡単です:random.shuffle `ものの、

from random import random 

def my_shuffle(x): 
    if len(x) == 1: 
     raise Exception 
    for i in reversed(range(1, len(x))): 
     # pick an element in x[:i] with which to exchange x[i] 
     j = int(random() * i) 
     x[i], x[j] = x[j], x[i] 
関連する問題