summaryrefslogtreecommitdiffstats
path: root/dependencies/pkg/mod/golang.org/x/exp@v0.0.0-20220613132600-b0d781184e0d/rand/modulo_test.go
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 12:36:04 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 12:36:04 +0000
commitb09c6d56832eb1718c07d74abf3bc6ae3fe4e030 (patch)
treed2caec2610d4ea887803ec9e9c3cd77136c448ba /dependencies/pkg/mod/golang.org/x/exp@v0.0.0-20220613132600-b0d781184e0d/rand/modulo_test.go
parentInitial commit. (diff)
downloadicingadb-upstream.tar.xz
icingadb-upstream.zip
Adding upstream version 1.1.0.upstream/1.1.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r--dependencies/pkg/mod/golang.org/x/exp@v0.0.0-20220613132600-b0d781184e0d/rand/modulo_test.go50
1 files changed, 50 insertions, 0 deletions
diff --git a/dependencies/pkg/mod/golang.org/x/exp@v0.0.0-20220613132600-b0d781184e0d/rand/modulo_test.go b/dependencies/pkg/mod/golang.org/x/exp@v0.0.0-20220613132600-b0d781184e0d/rand/modulo_test.go
new file mode 100644
index 0000000..da963c7
--- /dev/null
+++ b/dependencies/pkg/mod/golang.org/x/exp@v0.0.0-20220613132600-b0d781184e0d/rand/modulo_test.go
@@ -0,0 +1,50 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file validates that the calculation in Uint64n corrects for
+// possible bias.
+
+package rand
+
+import (
+ "testing"
+)
+
+// modSource is used to probe the upper region of uint64 space. It
+// generates values sequentially in [maxUint64-15,maxUint64]. With
+// modEdge == 15 and maxUint64 == 1<<64-1 == 18446744073709551615,
+// this means that Uint64n(10) will repeatedly probe the top range.
+// We thus expect a bias to result unless the calculation in Uint64n
+// gets the edge condition right. We test this by calling Uint64n 100
+// times; the results should be perfectly evenly distributed across
+// [0,10).
+type modSource uint64
+
+const modEdge = 15
+
+func (m *modSource) Seed(uint64) {}
+
+// Uint64 returns a non-pseudo-random 64-bit unsigned integer as a uint64.
+func (m *modSource) Uint64() uint64 {
+ if *m > modEdge {
+ *m = 0
+ }
+ r := maxUint64 - *m
+ *m++
+ return uint64(r)
+}
+
+func TestUint64Modulo(t *testing.T) {
+ var src modSource
+ rng := New(&src)
+ var result [10]uint64
+ for i := 0; i < 100; i++ {
+ result[rng.Uint64n(10)]++
+ }
+ for _, r := range result {
+ if r != 10 {
+ t.Fatal(result)
+ }
+ }
+}