package otherutils import "math/rand" // 从max个数中随机选择N个 func ReservoirSampling(n int, max int) []int { if n <= 0 || max <= 0 { return nil } // 先把候选数前N个放入数组中 result := make([]int, 0, n) for i := 0; i < max && i < n; i += 1 { result = append(result, i) } if n >= max { return result } for i := n; i < max; i++ { // 从0到i(包括)中随机选择一个索引j j := rand.Intn(i + 1) // 如果j小于n,则用当前元素i替换result中的第j个元素 if j < n { result[j] = i } // 当i足够大时,每个元素被选中的概率都接近1/n } return result }