reservoirrand.go 643 B

12345678910111213141516171819202122232425262728293031
  1. package otherutils
  2. import "math/rand"
  3. // 从max个数中随机选择N个
  4. func ReservoirSampling(n int, max int) []int {
  5. if n <= 0 || max <= 0 {
  6. return nil
  7. }
  8. // 先把候选数前N个放入数组中
  9. result := make([]int, 0, n)
  10. for i := 0; i < max && i < n; i += 1 {
  11. result = append(result, i)
  12. }
  13. if n >= max {
  14. return result
  15. }
  16. for i := n; i < max; i++ {
  17. // 从0到i(包括)中随机选择一个索引j
  18. j := rand.Intn(i + 1)
  19. // 如果j小于n,则用当前元素i替换result中的第j个元素
  20. if j < n {
  21. result[j] = i
  22. }
  23. // 当i足够大时,每个元素被选中的概率都接近1/n
  24. }
  25. return result
  26. }