package rand import ( "crypto/rand" "io" "sync" "time" mrnd "math/rand" "github.com/charlienet/go-mixed/bytesconv" ) const ( uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" lowercase = "abcdefghijklmnopqrstuvwxyz" digit = "0123456789" nomix = "BCDFGHJKMPQRTVWXY2346789" letter = uppercase + lowercase allChars = uppercase + lowercase + digit hex = digit + "ABCDEF" _ = allChars + "/+" ) type charScope struct { bytes []byte length int max int bits int mask int lenFunc func(int) int } func StringScope(str string) *charScope { return strScope(str, nil) } func strScope(str string, f func(int) int) *charScope { len := len(str) scope := &charScope{ bytes: bytesconv.StringToBytes(str), length: len, lenFunc: f, bits: 1, } for scope.mask < len { scope.bits++ scope.mask = 1<= 0; { if remain == 0 { cache, remain = randInt63(), scope.max } if idx := int(cache & int64(scope.mask)); idx < scope.length { ret[i] = scope.bytes[idx] i-- } cache >>= int64(scope.bits) remain-- } return bytesconv.BytesToString(ret) } // 获取指定范围内的随机数 func RandInt(min, max int) int { n := randNumber2(max - min) return n + min } // 生成指定范围的随机数 func RandInt32(min, max int32) int32 { return int32(RandInt(int(min), int(max))) } func RandBytes(len int) ([]byte, error) { r := make([]byte, len) _, err := io.ReadFull(rand.Reader, r) return r, err } // func randNumber(max int64) (int64, error) { // r, err := rand.Int(rand.Reader, big.NewInt(max+1)) // return r.Int64(), err // } func randInt63() int64 { var v int64 randLock.Lock() v = randSource.Int63() randLock.Unlock() return v } func randNumber2(max int) int { rnd := mrnd.New(randSource) return rnd.Intn(max) }