Knuth shuffle洗牌算法实现
shuffle算法保证每个数字出现在每个位置的概率是相等的
package main
import (
"fmt"
"math/rand"
)
func shuffle(arr []int) []int {
length := len(arr)
for i := length - 1; i >= 0; i-- {
// 临时下标
index := rand.Intn(i + 1)
// 交换值
arr[i], arr[index] = arr[index], arr[i]
}
return arr
}
func main() {
arr := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
fmt.Println(shuffle(arr))
}
运行结果:
[5 7 9 1 4 8 2 10 6 3]
[10 5 4 7 9 2 8 1 3 6]
[9 5 10 8 7 3 2 1 4 6]
算法原理:
假设有n个元素,每一轮我们选中一个元素,计算每个元素被选中的概率
第一轮:1/n
第二轮:(n-1/n) * (1/n-1) = 1/n
…
第N轮: (n-1/n) * (1/n-1) * …*(1/2) * (1/1) = 1/n
这样下来所有元素出现概率都是1/n.