dc5d924a2c
2021/03/02: 新增字符串匹配 暴力匹配、KMP匹配、SunDay匹配算法
2021/03/02: 修复Rand包随机获取方法
63 lines
1.7 KiB
Go
63 lines
1.7 KiB
Go
/*
|
||
* @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
|
||
}
|