浏览代码

Fix bug that ignores one sample in UniformSample

Pieter Noordhuis 13 年之前
父节点
当前提交
ef6ff7cde4
共有 2 个文件被更改,包括 23 次插入2 次删除
  1. 2 2
      sample.go
  2. 21 0
      sample_test.go

+ 2 - 2
sample.go

@@ -173,9 +173,9 @@ func (s *UniformSample) arbiter() {
 	for {
 		select {
 		case v := <-s.in:
-			count++
 			if count < s.reservoirSize {
-				values[count-1] = v
+				values[count] = v
+				count++
 				valuesCopy = make([]int64, count)
 			} else {
 				values[rand.Intn(s.reservoirSize)] = v

+ 21 - 0
sample_test.go

@@ -109,6 +109,27 @@ func TestUniformSample(t *testing.T) {
 	}
 }
 
+func TestUniformSampleIncludesTail(t *testing.T) {
+	s := NewUniformSample(100)
+	max := 100
+
+	for i := 0; i < max; i++ {
+		s.Update(int64(i))
+	}
+
+	v := s.Values()
+	sum := 0
+	exp := (max - 1) * max / 2
+
+	for i := 0; i < len(v); i++ {
+		sum += int(v[i])
+	}
+
+	if exp != sum {
+		t.Errorf("sum: %v != %v\n", exp, sum)
+	}
+}
+
 func benchmarkSample(b *testing.B, s Sample) {
 	var m runtime.MemStats
 	var p [2]uint64