1 package rand
2 3 import (
4 "crypto/rand"
5 "fmt"
6 "io"
7 "math/big"
8 )
9 10 func init() {
11 Reader = rand.Reader
12 }
13 14 // Reader provides a random reader that can reset during testing.
15 var Reader io.Reader
16 17 // Int63n returns a int64 between zero and value of max, read from an io.Reader source.
18 func 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.
29 func CryptoRandInt63n(max int64) (int64, error) {
30 return Int63n(Reader, max)
31 }
32