Skip to content

Instantly share code, notes, and snippets.

@leventov
Created February 12, 2021 20:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save leventov/6425331658c99ce43704eea860461281 to your computer and use it in GitHub Desktop.
Save leventov/6425331658c99ce43704eea860461281 to your computer and use it in GitHub Desktop.
import (
"log"
"math/rand"
"testing"
"github.com/montanaflynn/stats"
"gonum.org/v1/gonum/floats"
)
func TestMidCardinalitySimulation(t *testing.T) {
rnd := rand.New(rand.NewSource(1))
zipf := rand.NewZipf(rnd, 1.1, 1, 1000)
var vs []float64
for k := 0; k < 1000; k++ {
var sums []float64
used := make(map[uint64]bool)
for j := 0; j < 7; j++ {
var vs []float64
for len(used) < (j+1)*125 {
v := zipf.Uint64()
_, ok := used[v]
if !ok {
vs = append(vs, float64(v))
used[v] = true
}
}
sum, _ := stats.Sum(vs)
sums = append(sums, sum)
}
lastSum := uint64(0)
for v := uint64(0); v < 1000; v++ {
_, ok := used[v]
if !ok {
lastSum += v
}
}
sums = append(sums, float64(lastSum))
vs = append(vs, floats.Min(sums)/floats.Max(sums))
}
data := stats.Float64Data(vs)
mean, err := stats.Mean(data)
if err != nil {
log.Fatal(err)
}
sdev, err := stats.StdDevS(data)
if err != nil {
log.Fatal(err)
}
log.Printf("mean: %f, stddev: %f, max: %f", mean, sdev, floats.Max(vs))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment