从数学上得到过证明的还是经典 fisher-yates 算法,主要思路为每次随机挑选一个值,放到数组末尾。然后在 n-1 个元素的数组中再随机挑选一个值放在数组末尾,依此类推。

func shuffle(indexes []int) {
    for i:=len(indexes); i>0; i-- {
        lastIdx := i - 1
        idx := rand.Intn(i)
        indexes[lastIdx], indexes[idx] = indexes[idx], indexes[lastIdx]
    }
}

Go标准库中内置了该算法:

func shuffle(n int) []int {
    b := rand.Perm(n)
    return b
}

在当前的场景下,只要用rand.Perm就可以得到想要的索引数组了。

最后编辑: kuteng  文档更新时间: 2022-03-22 19:29   作者:kuteng