feat(Go-Tool):
2021/03/02: 新增字符串匹配 暴力匹配、KMP匹配、SunDay匹配算法
2021/03/02: 修复Rand包随机获取方法
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
/*
|
||||
* @Author : huangzj
|
||||
* @Time : 2021/2/23 20:52
|
||||
* @Description:
|
||||
*/
|
||||
|
||||
package rand
|
||||
|
||||
type AwardWeight struct {
|
||||
Award interface{} //奖励数据
|
||||
Weight int //权重
|
||||
}
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* @Author : huangzj
|
||||
* @Time : 2020/6/29 10:48
|
||||
* @Description:这边的随机获取没有加锁,对于一些需要加锁的场景可以在外面再包装一层
|
||||
* @Description:
|
||||
*/
|
||||
|
||||
package rand
|
||||
@@ -47,7 +47,7 @@ func GetRandIntNoRepeat(count, min, max int) []int {
|
||||
return randAttr
|
||||
}
|
||||
|
||||
//从一个数组中获取到X个不重复随机数
|
||||
//从一个数组中获取到X个不重复下标的随机数
|
||||
func GetDiffNum(data []int, count int) []int {
|
||||
if count > len(data) {
|
||||
panic("获取随机数数量有误")
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* @Author : huangzj
|
||||
* @Time : 2020/6/29 10:23
|
||||
* @Description:这边的随机获取没有加锁,对于一些需要加锁的场景可以在外面再包装一层
|
||||
* @Description:
|
||||
*/
|
||||
|
||||
package rand
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* @Author : huangzj
|
||||
* @Time : 2021/2/23 20:50
|
||||
* @Description:
|
||||
*/
|
||||
|
||||
package rand
|
||||
|
||||
func GetAwardWeightByWeight(awardWeight []*AwardWeight) *AwardWeight {
|
||||
//求总权重
|
||||
weight := 0
|
||||
for _, award := range awardWeight {
|
||||
weight += award.Weight
|
||||
}
|
||||
randNum := GetRandInt(1, weight)
|
||||
sum := 0
|
||||
for _, award := range awardWeight {
|
||||
sum += award.Weight
|
||||
if sum >= randNum {
|
||||
return award
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
//根据权重不放回的抽取,出参是:抽到的道具、剩余没有抽的道具
|
||||
func GetByWeightWithLeftAward(awardWeight []*AwardWeight) (*AwardWeight, []*AwardWeight) {
|
||||
weight := 0
|
||||
leftAwards := make([]*AwardWeight, 0)
|
||||
for _, award := range awardWeight {
|
||||
weight += award.Weight
|
||||
}
|
||||
randNum := GetRandInt(1, weight)
|
||||
sum := 0
|
||||
for index, award := range awardWeight {
|
||||
sum += award.Weight
|
||||
if sum >= randNum {
|
||||
//如果获取到奖励则将当前获取的奖励扣除
|
||||
leftAwards = append(awardWeight[0:index], awardWeight[index+1:]...)
|
||||
return award, leftAwards
|
||||
}
|
||||
}
|
||||
return nil, leftAwards
|
||||
}
|
||||
|
||||
// 根据权重不放回的抽取X个元素,直接返回这些元素
|
||||
// 入参:奖池、抽取数量,出参:获得的所有道具,剩余的其他道具
|
||||
func GetSomeAwardsFromPool(srcAwardPool []*AwardWeight, count int) ([]*AwardWeight, []*AwardWeight) {
|
||||
if count > len(srcAwardPool) {
|
||||
panic("抽取数量不对")
|
||||
}
|
||||
var finalAwardList []*AwardWeight
|
||||
var award *AwardWeight
|
||||
var leftAward = make([]*AwardWeight, len(srcAwardPool))
|
||||
copy(leftAward, srcAwardPool)
|
||||
|
||||
for i := 0; i < count; i++ {
|
||||
award, leftAward = GetByWeightWithLeftAward(leftAward)
|
||||
finalAwardList = append(finalAwardList, award)
|
||||
}
|
||||
return finalAwardList, leftAward
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* @Author : huangzj
|
||||
* @Time : 2021/2/23 22:08
|
||||
* @Description:
|
||||
*/
|
||||
|
||||
package rand
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestRandByAwardWeight(t *testing.T) {
|
||||
awardList := make([]*AwardWeight, 0)
|
||||
awardList = append(awardList, &AwardWeight{
|
||||
Award: []int{1, 2},
|
||||
Weight: 10,
|
||||
})
|
||||
awardList = append(awardList, &AwardWeight{
|
||||
Award: []int{2, 2},
|
||||
Weight: 20,
|
||||
})
|
||||
awardList = append(awardList, &AwardWeight{
|
||||
Award: []int{3, 2},
|
||||
Weight: 30,
|
||||
})
|
||||
|
||||
award := GetAwardWeightByWeight(awardList)
|
||||
fmt.Println(award.Award)
|
||||
|
||||
award1, list3 := GetByWeightWithLeftAward(awardList)
|
||||
fmt.Println(award1.Award)
|
||||
for _, award := range list3 {
|
||||
fmt.Println(award.Award)
|
||||
}
|
||||
|
||||
list4, left := GetSomeAwardsFromPool(awardList, 2)
|
||||
for _, award := range list4 {
|
||||
fmt.Println(award.Award)
|
||||
}
|
||||
for _, award := range left {
|
||||
fmt.Println(award.Award)
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user