Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e0afb55bb2 | ||
|
|
a469692358 |
@@ -38,13 +38,14 @@ func init() {
|
||||
// @receiver s *sIp2region: sIp2region的实例。
|
||||
func (s *sIp2region) Load() {
|
||||
var err error
|
||||
|
||||
var url = "https://github.com/ayflying/resource/raw/refs/heads/main/attachment/ip2region.xdb"
|
||||
var dbPath = "runtime/library/ip2region.xdb"
|
||||
|
||||
if gfile.IsEmpty(dbPath) {
|
||||
g.Log().Debug(ctx, "等待下载ip库文件")
|
||||
//下载文件
|
||||
putData, err2 := g.Client().Discovery(nil).
|
||||
Get(ctx, "https://resource.luoe.cn/attachment/ip2region.xdb")
|
||||
putData, err2 := g.Client().Discovery(nil).Get(ctx, url)
|
||||
if err2 != nil {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -53,12 +53,52 @@ func (m *randMod) RandomAll(data map[int]int, n int) []int {
|
||||
return result
|
||||
}
|
||||
|
||||
func RandomAll[t Any](data map[t]int, n int) []t {
|
||||
if n > len(data) {
|
||||
n = len(data)
|
||||
}
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
// 复制权重映射,避免修改原始数据
|
||||
remainingWeights := make(map[t]int)
|
||||
for k, v := range data {
|
||||
remainingWeights[k] = v
|
||||
}
|
||||
result := make([]t, 0, n)
|
||||
|
||||
for i := 0; i < n; i++ {
|
||||
totalWeight := 0
|
||||
// 计算剩余元素的总权重
|
||||
for _, weight := range remainingWeights {
|
||||
totalWeight += weight
|
||||
}
|
||||
if totalWeight == 0 {
|
||||
break
|
||||
}
|
||||
// 生成一个 0 到总权重之间的随机数
|
||||
randomNum := rand.Intn(totalWeight)
|
||||
currentWeight := 0
|
||||
for key, weight := range remainingWeights {
|
||||
currentWeight += weight
|
||||
if randomNum < currentWeight {
|
||||
// 将选中的元素添加到结果切片中
|
||||
result = append(result, key)
|
||||
// 从剩余权重映射中移除选中的元素
|
||||
delete(remainingWeights, key)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// RandByArrInt 根据传入的 interface 切片中的整数值按权重随机返回一个索引
|
||||
// 参数 s: 一个包含整数的 interface 切片,切片中的每个元素代表一个权重
|
||||
// 返回值: 随机选中的元素的索引
|
||||
func RandByArrInt(s []interface{}) int {
|
||||
func (m *randMod) RandByArrInt(_s interface{}) int {
|
||||
// 初始化总权重为 0
|
||||
sv := 0
|
||||
s := gconv.Ints(_s)
|
||||
|
||||
// 遍历切片,累加每个元素的权重
|
||||
for i := range s {
|
||||
sv += gconv.Int(s[i])
|
||||
@@ -73,7 +113,7 @@ func RandByArrInt(s []interface{}) int {
|
||||
var all int
|
||||
// 再次遍历切片,累加权重
|
||||
for i := range s {
|
||||
all += gconv.Int(s[i])
|
||||
all += s[i]
|
||||
// 如果当前累加的权重大于随机数,则返回当前索引
|
||||
if all > r {
|
||||
return i
|
||||
|
||||
@@ -20,9 +20,9 @@ type Number interface {
|
||||
int | int64 | int32 | int16 | uint64 | uint32 | uint16 | float32 | float64
|
||||
}
|
||||
|
||||
//type Any interface {
|
||||
// interface{} | string | int | int64 | int32 | int16 | uint64 | uint32 | uint16 | float32 | float64
|
||||
//}
|
||||
type Any interface {
|
||||
string | int | int64 | int32 | int16 | uint64 | uint32 | uint16 | float32 | float64
|
||||
}
|
||||
|
||||
type toolsInterface interface {
|
||||
Load()
|
||||
@@ -132,7 +132,7 @@ func RemoveSlice[t Number](slice []t, value ...t) []t {
|
||||
// 从后向前遍历切片
|
||||
for i := len(slice) - 1; i >= 0; i-- {
|
||||
// 检查当前元素是否等于需要移除的值
|
||||
if InArray(slice[i], value) {
|
||||
if InArray[t](value, slice[i]) {
|
||||
// 如果相等,移除该元素
|
||||
// 使用append和切片操作符来实现移除操作,将i之前和i之后的元素合并到一起
|
||||
slice = append(slice[:i], slice[i+1:]...)
|
||||
@@ -149,7 +149,7 @@ func RemoveSlice[t Number](slice []t, value ...t) []t {
|
||||
// @param value 需要查找的值
|
||||
// @param array 进行查找的切片
|
||||
// @return bool 返回是否存在
|
||||
func InArray[t Number](value t, array []t) bool {
|
||||
func InArray[t Number](array []t, value t) bool {
|
||||
for _, v := range array {
|
||||
if v == value {
|
||||
return true
|
||||
|
||||
Reference in New Issue
Block a user