项目场景:
给定一个数组,将其进行随机shuffle
算法实现
import random
def shuffel(x):
for i in reversed(range(1, len(x))):
p = int(random.random() * i)
x[i], x[p] = x[p], x[i]
print("i:",i," p:",p)
print(x)
return x
shuffel([1, 2, 2, 3, 3, 4, 5, 10])
i: 7 p: 2
[1, 2, 10, 3, 3, 4, 5, 2]
i: 6 p: 5
[1, 2, 10, 3, 3, 5, 4, 2]
i: 5 p: 4
[1, 2, 10, 3, 5, 3, 4, 2]
i: 4 p: 3
[1, 2, 10, 5, 3, 3, 4, 2]
i: 3 p: 0
[5, 2, 10, 1, 3, 3, 4, 2]
i: 2 p: 1
[5, 10, 2, 1, 3, 3, 4, 2]
i: 1 p: 0
[10, 5, 2, 1, 3, 3, 4, 2]
原因分析:
数组从后往前,开始。确保每个数字都被交换过一次位置。i调控交换位置的区间,因为最后面的数字已经被交换过,所以i的区间会对应缩小。