Fisher-Yates洗牌意味着我们每次从选定的段中取出最后一个数字,并将其与先前随机选择的数字交换,不断迭代,最终实现随机洗牌。python3.6 中官方 Shuffle 的代码如下
_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()
是[0, 1)
范围内的浮点数。当你把它乘以i+1
时,你会得到一个[0, i+1)
范围内的浮点数。当您将其转换为整数时,您会得到一个范围为[0, i]
的整数。
当然,你可以只使用random.randint(0, i)
.reverse(range(1, len(x))
可以简化为range(len(x)-1, 0, -1)
.