如何在列表中随机播放项目,同时避免任何项目保留在原始位置?

ntr*_*rme 1 python random

我有一个问题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
Run Code Online (Sandbox Code Playgroud)

此代码通过测试(如果可以进行随机播放),但有更简单,更快速的方法吗?

wim*_*wim 7

实际执行random.shuffle是很简单的:

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]
Run Code Online (Sandbox Code Playgroud)

稍微修改相同的想法,我们可以添加您的新要求:

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]
Run Code Online (Sandbox Code Playgroud)