feat(Go-Tool):
2021/03/02: 新增字符串匹配 暴力匹配、KMP匹配、SunDay匹配算法
2021/03/02: 修复Rand包随机获取方法
This commit is contained in:
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user