阿波罗配置加入

This commit is contained in:
ayflying
2024-12-23 18:04:41 +08:00
parent 72d021a179
commit 41dd5e4db9
5 changed files with 803 additions and 0 deletions

50
rand/rand.go Normal file
View File

@@ -0,0 +1,50 @@
package utility
import (
"math/rand"
"time"
)
// rands 结构体用于封装 rand.Rand 实例,以提供随机数生成功能。
// 该结构体目前不包含锁,因此在多线程环境下使用时应注意同步问题。
type rands struct {
r *rand.Rand
// lock sync.Mutex
}
// Rand 是一个全局的 rands 实例,用于在整个程序中生成随机数。
// 它使用当前时间的毫秒值作为随机源,以确保每次程序运行时都能获得不同的随机数序列。
var Rand = rands{
r: rand.New(rand.NewSource(time.Now().UnixMilli())),
}
// RandByArrInt 函数从一个整数数组中按权重选择一个索引,并返回该索引。
// 权重是数组中相应元素的值。该函数通过计算累积和来确定选择的索引。
// 参数 v 是一个泛型参数,限制为实现了 Number 接口的类型。
// 返回值是一个整数,表示在数组中的索引。
func RandByArrInt[v Number](s []v) int {
sv := 0
for i := range s {
sv += int(s[i])
}
r := Rand.Intn(sv)
var all v
for i := range s {
all += s[i]
if all > v(r) {
return i
}
}
return 0
}
// Intn 方法通过给定的整数 i 生成一个 0 到 i-1 之间的随机数。
// 如果 i 为0则会触发 panic。
// 参数 i 是一个整数,表示生成随机数的上限(不包含)。
// 返回值 ret 是一个在 0 到 i-1 范围内的随机整数。
func (r rands) Intn(i int) (ret int) {
if i == 0 {
panic(1)
}
return rand.Intn(i)
}