从数学上得到过证明的还是经典 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