random.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package pkg
  2. import (
  3. "math/rand"
  4. "strings"
  5. "time"
  6. )
  7. func RandomSecondDuration(min, max int32) time.Duration {
  8. tmp := src.Int31n(max-min) + min
  9. return time.Duration(tmp) * time.Second
  10. }
  11. func RandStringBytesMaskImprSrcSB(n int) string {
  12. sb := strings.Builder{}
  13. sb.Grow(n)
  14. // A src.Int63() generates 63 random bits, enough for letterIdxMax characters!
  15. for i, cache, remain := n-1, src.Int63(), letterIdxMax; i >= 0; {
  16. if remain == 0 {
  17. cache, remain = src.Int63(), letterIdxMax
  18. }
  19. if idx := int(cache & letterIdxMask); idx < len(letterBytes) {
  20. sb.WriteByte(letterBytes[idx])
  21. i--
  22. }
  23. cache >>= letterIdxBits
  24. remain--
  25. }
  26. return sb.String()
  27. }
  28. var (
  29. src = rand.New(rand.NewSource(time.Now().UnixNano()))
  30. )
  31. const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  32. const (
  33. letterIdxBits = 6 // 6 bits to represent a letter index
  34. letterIdxMask = 1<<letterIdxBits - 1 // All 1-bits, as many as letterIdxBits
  35. letterIdxMax = 63 / letterIdxBits // # of letter indices fitting in 63 bits
  36. )