你有一些错误,我已经为你解决了,我会分解它,目前正在解释你出错的所有部分。
import random
def shuffle(some_ary, mixes):
d = len(some_ary) - 1
for i in range(mixes):
x = random.randint(0, d)
y = random.randint(0, d)
while y == x:
y = random.randint(0, d)
some_ary[x], some_ary[y] = some_ary[y], some_ary[x]
return some_ary
ary = [1,2,3,4,5]
print(f"Shuffle: {shuffle(ary, 10)}")
(xenial)vash@localhost:~/python/stack_overflow$ python3.7 shuffle.py
Shuffle: [5, 2, 3, 4, 1]
第一件事:
def shuffle(ary):
ary = [1,2,3,4,5]
您将 ary 贴在函数内部,我们需要将其移到外部,以便我们可以使用 suffle(ary) 将其传递给函数
d=len[ary]
b=d-1
这应该是一行d = len[ary] - 1
while (d > 0):
现在好东西 :) 首先我们有 while(d > 0),如果你想使用它,我们必须添加一些最终结束这个循环的东西,所以在每次运行后让我们添加一个 d -= 1,但即使这样你也应该使用for loop 而不是for i in range(mixes) 不需要在这里使用d,因为周期的数量实际上取决于您,您走得越高,我们将获得更多的随机化。在此示例中,让我们将 mixes 与我们的数组一起传递。
接下来我们的洗牌:
x=random.randint(0,d)
在您的代码上下文中,这将是0 和5 之间的随机数,因为lists 从0 索引开始,您当前的ary 具有来自0-4 的索引
所以我们想要一个在那个范围内的随机整数,在你的代码中这应该是b,因为b是d - 1。
if x == d:
如果说if the random int == 5 超出了索引范围,我们假设您的意思是4,所有这一切只会给我们一个4 的索引,这不是' t 我们想要的洗牌我们想要一个随机索引,所以让我们摆脱它。
让我们取另一个随机变量来交换,所以我们总是交换两个随机数
y = random.randint(0, b)
while y == x:
y = random.randint(0, b)
这里我们为索引生成另一个随机数,但也要确保它不等于我们正在交换的那个
最后我们交换:
ary[b],ary[x]=ary[x],ary[d]
同样,如果我们使用这种方法,我们只会将最后一个数字与随机数字交换,更不用说d 会超出范围`
some_ary[x], some_ary[y] = some_ary[y], some_ary[x]
让我们交换两个随机位置
然后我们可以:
results = shuffle(ary, 10)
print(results)
或
print(f"{shuffle(ary, 10)}")
希望这会有所帮助! :)