Просмотр исходного кода

Fix reservoir sampling algorithm for uniform sample

Old variant was representing a moving window.

See also: https://github.com/rcrowley/go-metrics/issues/56

http://en.wikipedia.org/wiki/Reservoir_sampling
Artyom Pervukhin 11 лет назад
Родитель
Сommit
be3d0df071
1 измененных файлов с 5 добавлено и 1 удалено
  1. 5 1
      sample.go

+ 5 - 1
sample.go

@@ -394,6 +394,7 @@ type UniformSample struct {
 	count         int64
 	mutex         sync.Mutex
 	reservoirSize int
+	count         int64
 	values        []int64
 }
 
@@ -504,7 +505,10 @@ func (s *UniformSample) Update(v int64) {
 	if len(s.values) < s.reservoirSize {
 		s.values = append(s.values, v)
 	} else {
-		s.values[rand.Intn(s.reservoirSize)] = v
+		r := rand.Int63n(s.count)
+		if r < int64(len(s.values)) {
+			s.values[int(r)] = v
+		}
 	}
 }