1package rand
2
3import (
4 "crypto/rand"
5 "fmt"
6 "io"
7 "math/big"
8)
9
10func init() {
11 Reader = rand.Reader
12}
13
14// Reader provides a random reader that can reset during testing.
15var Reader io.Reader
16
17// Int63n returns a int64 between zero and value of max, read from an io.Reader source.
18func Int63n(reader io.Reader, max int64) (int64, error) {
19 bi, err := rand.Int(reader, big.NewInt(max))
20 if err != nil {
21 return 0, fmt.Errorf("failed to read random value, %w", err)
22 }
23
24 return bi.Int64(), nil
25}
26
27// CryptoRandInt63n returns a random int64 between zero and value of max
28// obtained from the crypto rand source.
29func CryptoRandInt63n(max int64) (int64, error) {
30 return Int63n(Reader, max)
31}