rand/rand.go

94 lines
2.0 KiB
Go

package rand
import (
"math/rand/v2"
"sync"
"sync/atomic"
"time"
)
var seedCounter atomic.Uint64
var pcgPool = sync.Pool{
New: func() any {
return rand.New(rand.NewPCG(uint64(time.Now().UnixNano()), seedCounter.Add(1)))
},
}
// IntegerType 约束支持所有整数类型
type IntegerType interface {
~int | ~int8 | ~int16 | ~int32 | ~int64 |
~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr
}
// FloatType 约束支持所有浮点类型
type FloatType interface {
~float32 | ~float64
}
// --- 基础整数 ---
// Int 获取 [min, max] 闭区间随机整数
func Int[T IntegerType](min, max T) T {
if max < min { return min }
diff := uint64(max - min)
return min + T(rand.Uint64N(diff+1))
}
// FastInt 获取 [min, max] 闭区间随机整数 (高性能并发模式)
func FastInt[T IntegerType](min, max T) T {
if max < min { return min }
inst := pcgPool.Get().(*rand.Rand)
diff := uint64(max - min)
res := inst.Uint64N(diff + 1)
pcgPool.Put(inst)
return min + T(res)
}
// --- 浮点数 ---
// Float 获取 [min, max) 区间随机浮点数
func Float[T FloatType](min, max T) T {
if max <= min { return min }
return min + T(rand.Float64())*T(max-min)
}
// FastFloat 获取 [min, max) 区间随机浮点数 (高性能并发模式)
func FastFloat[T FloatType](min, max T) T {
if max <= min { return min }
inst := pcgPool.Get().(*rand.Rand)
res := inst.Float64()
pcgPool.Put(inst)
return min + T(res)*T(max-min)
}
// --- 字节与切片 ---
// Byte 获取一个随机字节
func Byte() byte {
return byte(rand.Uint32N(256))
}
// Bytes 获取长度为 n 的随机字节切片
func Bytes(n int) []byte {
if n <= 0 { return []byte{} }
b := make([]byte, n)
for i := range b {
b[i] = Byte()
}
return b
}
// --- 集合辅助 ---
// Perm 获取 [0, n) 的随机排列
func Perm(n int) []int {
if n <= 0 { return []int{} }
return rand.Perm(n)
}
// Shuffle 随机洗牌
func Shuffle(n int, swap func(i, j int)) {
if n <= 0 { return }
rand.Shuffle(n, swap)
}