package xrand import ( "math/rand" "time" ) func init() { rand.New(rand.NewSource(time.Now().UnixNano())) } func Int() int { return rand.Int() } func Intn(n int) int { return rand.Intn(n) } func Int31() int32 { return rand.Int31() } func Int31n(n int32) int32 { return rand.Int31n(n) } func Int63() int64 { return rand.Int63() } func Int63n(n int64) int64 { return rand.Int63n(n) } func Uint32() uint32 { return rand.Uint32() } func Uint64() uint64 { return rand.Uint64() } func Float32() float32 { return rand.Float32() } func Float64() float64 { return rand.Float64() } func Perm(n int) []int { return rand.Perm(n) } func Read(p []byte) (n int, err error) { return rand.Read(p) } func Shuffle[T any](slice []T) { rand.Shuffle(len(slice), func(i, j int) { slice[i], slice[j] = slice[j], slice[i] }) } // RandomInt64 随机生成一个[min, max]之间的整数 func RandomInt64(min, max int64) int64 { return Int63n(max-min) + min } func Roll(source map[int32]int32) int32 { // 1. 统计权重 // 2. roll // 3. 查找产出 // 1. 统计权重 var total = 0 for _, v := range source { total += int(v) } // 2. roll r := rand.Intn(total) + 1 // 3. 查找产出 var temp = 0 for k, v := range source { temp += int(v) if temp >= r { return k } } return 0 }