rand.go raw

   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