74 lines
1.2 KiB
Go
74 lines
1.2 KiB
Go
package test
|
|
|
|
import "math"
|
|
import "math/bits"
|
|
import "testing"
|
|
|
|
import "github.com/firestuff/subcoding/gen"
|
|
|
|
func TestRandBiasedUint64(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
buckets := [65]uint64{}
|
|
|
|
for i := 0; i < 1000000; i++ {
|
|
val := gen.RandBiasedUint64()
|
|
buckets[bits.Len64(val)]++
|
|
}
|
|
|
|
var max uint64 = 0
|
|
var min uint64 = math.MaxUint64
|
|
|
|
for _, count := range buckets {
|
|
if count > max {
|
|
max = count
|
|
}
|
|
|
|
if count < min {
|
|
min = count
|
|
}
|
|
}
|
|
|
|
if max-min > max/10 {
|
|
t.Fatalf("Variance greater than allowed: %d > %d (max=%d min=%d)", max-min, max/10, max, min)
|
|
}
|
|
}
|
|
|
|
func TestRandBiasedInt64(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
// [0,62]: positive
|
|
// [63,63]: zero
|
|
// [64,126]: negative
|
|
buckets := [127]uint64{}
|
|
|
|
for i := 0; i < 1000000; i++ {
|
|
val := int64(gen.RandBiasedInt64())
|
|
switch {
|
|
case val == 0:
|
|
buckets[63]++
|
|
case val < 0:
|
|
buckets[63+bits.Len64(uint64(val*-1))]++
|
|
case val > 0:
|
|
buckets[63-bits.Len64(uint64(val))]++
|
|
}
|
|
}
|
|
|
|
var max uint64 = 0
|
|
var min uint64 = math.MaxUint64
|
|
|
|
for _, count := range buckets {
|
|
if count > max {
|
|
max = count
|
|
}
|
|
|
|
if count < min {
|
|
min = count
|
|
}
|
|
}
|
|
|
|
if max-min > max/10 {
|
|
t.Fatalf("Variance greater than allowed: %d > %d (max=%d min=%d)", max-min, max/10, max, min)
|
|
}
|
|
}
|