Knuth洗牌算法
- In iteration i, pick integer r between 0 and i uniformly at random
- Swap a[i] and a[r]
时间复杂度O(n)
Go语言描述
func main() {
nums := []int{
1, 2, 3, 4, 5, 6, 8, 9}
knuthShuffle(nums)
}
func knuthShuffle(nums []int) {
rand.Seed(time.Now().UnixNano())
for i := 0; i < len(nums); i++ {
r := rand.Intn(i+1)
nums[i], nums[r] = nums[r], nums[i]
}
}
Go语言rand.Shuffle API
a := []int{
1, 2, 3, 4, 5, 6, 7, 8}
rand.Seed(time.Now().UnixNano())
rand.Shuffle(len(a), func(i, j int) {
a[i], a[j] = a[j], a[i] })