随机选择要在洗牌函数中交换的位置的原理是什么?



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).

最新更新