rand.go 726 B

123456789101112131415161718192021222324252627282930313233
  1. package rand
  2. import (
  3. "crypto/rand"
  4. "fmt"
  5. "io"
  6. "math/big"
  7. )
  8. func init() {
  9. Reader = rand.Reader
  10. }
  11. // Reader provides a random reader that can reset during testing.
  12. var Reader io.Reader
  13. var floatMaxBigInt = big.NewInt(1 << 53)
  14. // Float64 returns a float64 read from an io.Reader source. The returned float will be between [0.0, 1.0).
  15. func Float64(reader io.Reader) (float64, error) {
  16. bi, err := rand.Int(reader, floatMaxBigInt)
  17. if err != nil {
  18. return 0, fmt.Errorf("failed to read random value, %v", err)
  19. }
  20. return float64(bi.Int64()) / (1 << 53), nil
  21. }
  22. // CryptoRandFloat64 returns a random float64 obtained from the crypto rand
  23. // source.
  24. func CryptoRandFloat64() (float64, error) {
  25. return Float64(Reader)
  26. }