mirror of
https://github.com/tiny-craft/tiny-rdm.git
synced 2025-10-06 23:52:52 +08:00
Initial commit
This commit is contained in:
103
backend/utils/rand/random.go
Normal file
103
backend/utils/rand/random.go
Normal file
@@ -0,0 +1,103 @@
|
||||
package rand
|
||||
|
||||
import (
|
||||
"math/rand"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
// 随机对象缓存池(解决自带随机函数全局抢锁问题)
|
||||
var randObjectPool = sync.Pool{
|
||||
New: func() interface{} {
|
||||
return rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||
},
|
||||
}
|
||||
var lowerChar = []rune("abcdefghijklmnopqrstuvwxyz") // strings.Split("abcdefghijklmnopqrstuvwxyz", "")
|
||||
var upperChar = []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZ") // strings.Split("ABCDEFGHIJKLMNOPQRSTUVWXYZ", "")
|
||||
var numberChar = []rune("0123456789") // strings.Split("0123456789", "")
|
||||
var numberAndChar = append(lowerChar, numberChar...)
|
||||
|
||||
func init() {
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
}
|
||||
|
||||
func Intn[T ~int](n T) T {
|
||||
r := randObjectPool.Get()
|
||||
res := r.(*rand.Rand).Intn(int(n))
|
||||
randObjectPool.Put(r)
|
||||
return T(res)
|
||||
}
|
||||
|
||||
func IntnCount[T ~int](n T, count int) []T {
|
||||
res := make([]T, count)
|
||||
r := randObjectPool.Get()
|
||||
for i := 0; i < count; i++ {
|
||||
res[i] = T(r.(*rand.Rand).Intn(int(n)))
|
||||
}
|
||||
randObjectPool.Put(r)
|
||||
return res
|
||||
}
|
||||
|
||||
// Int31n 生成<n的32位整形
|
||||
func Int31n[T ~int32](n T) T {
|
||||
r := randObjectPool.Get()
|
||||
res := r.(*rand.Rand).Int31n(int32(n))
|
||||
randObjectPool.Put(r)
|
||||
return T(res)
|
||||
}
|
||||
|
||||
// Int63n 生成小于n的64位整形
|
||||
func Int63n[T ~int64](n T) T {
|
||||
r := randObjectPool.Get()
|
||||
res := r.(*rand.Rand).Int63n(int64(n))
|
||||
randObjectPool.Put(r)
|
||||
return T(res)
|
||||
}
|
||||
|
||||
// RangeInt 获取范围内的随机整数[min, max)
|
||||
func RangeInt[T ~int](min, max T) T {
|
||||
if min > max {
|
||||
min, max = max, min
|
||||
}
|
||||
return Intn(max-min) + min
|
||||
}
|
||||
|
||||
// RangeString 生成随机字符串
|
||||
func RangeString(charSet []rune, n int) string {
|
||||
r := randObjectPool.Get()
|
||||
|
||||
res := strings.Builder{}
|
||||
size := len(charSet)
|
||||
for i := 0; i < n; i++ {
|
||||
res.WriteRune(charSet[r.(*rand.Rand).Intn(size)])
|
||||
}
|
||||
randObjectPool.Put(r)
|
||||
return res.String()
|
||||
}
|
||||
|
||||
// LowerString 生成随机指定长度小写字母
|
||||
func LowerString(n int) string {
|
||||
return RangeString(lowerChar, n)
|
||||
}
|
||||
|
||||
// UpperString 生成随机指定长度大写字母
|
||||
func UpperString(n int) string {
|
||||
return RangeString(upperChar, n)
|
||||
}
|
||||
|
||||
// NumberString 生成随机指定长度数字字符串
|
||||
func NumberString(n int) string {
|
||||
return RangeString(numberChar, n)
|
||||
}
|
||||
|
||||
// CharNumberString 生成随机指定长度小写字母和数字
|
||||
func CharNumberString(n int) string {
|
||||
return RangeString(numberAndChar, n)
|
||||
}
|
||||
|
||||
// Shuffle 执行指定次数打乱
|
||||
func Shuffle(n int, swap func(i, j int)) {
|
||||
r := randObjectPool.Get()
|
||||
r.(*rand.Rand).Shuffle(n, swap)
|
||||
}
|
Reference in New Issue
Block a user