github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/randx/rand.go (about)

     1  package randx
     2  
     3  import (
     4  	"bytes"
     5  	"crypto/rand"
     6  	"encoding/binary"
     7  	"log"
     8  	"math"
     9  	"math/big"
    10  	"time"
    11  )
    12  
    13  // from https://github.com/thanhpk/randstr
    14  
    15  // list of default letters that can be used to make a random string when calling String
    16  // function with no letters provided
    17  var defLetters = []rune("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
    18  
    19  // String generates a random string using only letters provided in the letters parameter
    20  // if user ommit letters parameters, this function will use defLetters instead
    21  func String(n int, letters ...string) string {
    22  	var letterRunes []rune
    23  	if len(letters) == 0 {
    24  		letterRunes = defLetters
    25  	} else {
    26  		letterRunes = []rune(letters[0])
    27  	}
    28  
    29  	var bb bytes.Buffer
    30  	bb.Grow(n)
    31  	l := uint32(len(letterRunes))
    32  	// on each loop, generate one random rune and append to output
    33  	for i := 0; i < n; i++ {
    34  		bb.WriteRune(letterRunes[binary.BigEndian.Uint32(Bytes(4))%l])
    35  	}
    36  	return bb.String()
    37  }
    38  
    39  // Bytes generates n random bytes.
    40  func Bytes(n int) []byte {
    41  	b := make([]byte, n)
    42  	_, err := rand.Read(b)
    43  	if err != nil {
    44  		panic(err)
    45  	}
    46  	return b
    47  }
    48  
    49  var rander = rand.Reader // random function
    50  
    51  func Time() time.Time {
    52  	min := time.Date(1970, 1, 0, 0, 0, 0, 0, time.UTC)
    53  	max := time.Date(2070, 1, 0, 0, 0, 0, 0, time.UTC)
    54  	return TimeBetween(min, max)
    55  }
    56  
    57  func TimeBetween(min, max time.Time) time.Time {
    58  	minUnit, maxUnix := min.Unix(), max.Unix()
    59  	n, _ := rand.Int(rander, big.NewInt(maxUnix-minUnit))
    60  	return time.Unix(n.Int64()+minUnit, 0)
    61  }
    62  
    63  func Bool() bool { return Int64Between(0, 1) == 0 }
    64  
    65  func Int64() int64 { return Int64N(math.MaxInt64) }
    66  
    67  func Int64N(n int64) int64 {
    68  	v, _ := rand.Int(rander, big.NewInt(n))
    69  	return v.Int64()
    70  }
    71  
    72  func Int64Between(min, max int64) (v int64) { return Int64N(max-min+1) + min }
    73  
    74  func IntN(n int) int {
    75  	v, _ := rand.Int(rander, big.NewInt(int64(n)))
    76  	return int(v.Int64())
    77  }
    78  func Int() int { return int(Int32()) }
    79  
    80  func IntBetween(min, max int) int { return IntN(max-min+1) + min }
    81  
    82  func Int32N(n int) int32 {
    83  	v, _ := rand.Int(rander, big.NewInt(int64(n)))
    84  	return int32(v.Int64())
    85  }
    86  
    87  func Int32() int32 { return Int32N(math.MaxInt32) }
    88  
    89  func Uint64N(n int64) uint64 {
    90  	v, _ := rand.Int(rander, big.NewInt(n))
    91  	return v.Uint64()
    92  }
    93  
    94  func Uint64() (v uint64) {
    95  	err := binary.Read(rander, binary.BigEndian, &v)
    96  	if err != nil {
    97  		log.Fatal(err)
    98  	}
    99  	return v
   100  }