Go的两种不重复随机实现

in Golang with 0 comment

第一种,使用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
}

第二种,常见的生成方法,但是如果randomElementsCountlen(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
        }
    }
}
Responses