今天我们介绍一种 Shuffle算法,它保证了对数组shuffle后,任何一个元素出现在数组中任何一个位置的概率是相等的。并且这个算法复杂度为 O(n)
算法以及实现
对于一个需要 Shuffle的数组 A,其长度为 n。
假设我们有这样的一个函数 rand(0, n),它可以均匀地生成 [0,…,n]之间的随机整数。
Fisher-Yates Shuffle Algorithm 这样给出解决方案:
- Let k = n-1, (A is 0-indexed)
- start from node k, swap it with a randomly selected element from the array of first k elements
- decrease k by one
- Repeat 1, 2 until k hits 0
import random
import math
def shuffle(A):
for i in range(len(A)-1, 0, -1):
j = math.floor(random.random() *