洗牌算法 Knuth shuffle

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] })

猜你喜欢

转载自blog.csdn.net/weixin_45867397/article/details/120315102