feat(Go-Tool):

2021/03/02: 新增字符串匹配 暴力匹配、KMP匹配、SunDay匹配算法
            2021/03/02: 修复Rand包随机获取方法
This commit is contained in:
Huangzj
2021-03-02 13:33:07 +08:00
parent 74dd19c675
commit dc5d924a2c
13 changed files with 385 additions and 7 deletions
+12
View File
@@ -0,0 +1,12 @@
/*
* @Author : huangzj
* @Time : 2021/2/23 20:52
* @Description
*/
package rand
type AwardWeight struct {
Award interface{} //奖励数据
Weight int //权重
}
+2 -2
View File
@@ -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 -1
View File
@@ -1,7 +1,7 @@
/*
* @Author : huangzj
* @Time : 2020/6/29 10:23
* @Description这边的随机获取没有加锁,对于一些需要加锁的场景可以在外面再包装一层
* @Description
*/
package rand
+62
View File
@@ -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
}
+46
View File
@@ -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)
}
}