Signed biased distribution generator

This commit is contained in:
Ian Gulliver
2021-11-20 16:56:07 -10:00
parent c12a546447
commit 56f61545ce
2 changed files with 51 additions and 1 deletions

View File

@@ -6,5 +6,19 @@ import "math/rand"
func RandBiasedUint64() uint64 {
// The shift-right by up to 64 (shifting it to 0) makes up for randomness
// lost by setting the high bit.
return (rand.Uint64() | 0x8000000000000000) >> rand.Int31n(65)
return (rand.Uint64() | 0x8000000000000000) >> rand.Intn(65)
}
// Generate a random int64 with an even distribution of the tuple
// {sign, bits.Len64(math.Abs())}
func RandBiasedInt64() int64 {
shift := rand.Intn(127)
// [0,62]: positive
// [63,63]: zero
// [64,126]: negative
if shift < 64 {
return int64((rand.Uint64() | 0x8000000000000000) >> (shift + 1))
} else {
return int64((rand.Uint64() | 0x8000000000000000) >> (shift - 63)) * -1
}
}