第一种,使用rand.Perm,但是会稍微浪费一点内存,如果 randomElementsCount << len(array)
那就不太合适
func getRandomElements(array []int, randomElementsCount int) []int{
ii := rand.Perm(len(array))
for k, i := range ii[:randomElementsCount] {
result[k] = array[i]
}
return result
}
第二种,常见的生成方法,但是如果randomElementsCount
与len(array)
差距很小,那么时间上将会很窒息
func getRandomElements(array []int, randomElementsCount int) []int{
result := make([]int, randomElementsCount)
existingIndexes := make(map[int]struct{}, 0)
for i := 0; i < randomElementsCount; i++ {
randomIndex := randomIndex(len(array), existingIndexes)
result[i] = array[randomIndex]
}
return result
}
func randomIndex(size int, existingIndexes map[int]struct{}) int {
rand.Seed(time.Now().UnixNano())
for {
randomIndex := rand.Intn(size)
_, exists := existingIndexes[randomIndex]
if !exists {
existingIndexes[randomIndex] = struct{}{}
return randomIndex
}
}
}
本文由 hunsh 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Mar 25, 2021 at 11:47 pm