权重工具
案例
package util_test
import (
"github.com/thkhxm/tgf/util"
"testing"
)
//***************************************************
//@Link https://github.com/thkhxm/tgf
//@Link https://gitee.com/timgame/tgf
//@QQ群 7400585
//author tim.huang<thkhxm@gmail.com>
//@Description
//2023/11/29
//***************************************************
func Test_weightOperation_Roll(t *testing.T) {
builder := util.NewWeightBuilder[int32]().Seed(1001)
builder.AddWeight(10, 10, 1)
builder.AddWeight(20, 10, 2)
builder.AddWeight(30, 1, 3)
builder.AddWeight(40, 10, 4)
builder.AddWeight(50, 10, 5)
w := builder.Build()
for i := 0; i < 5; i++ {
t.Logf("roll number : %d", w.Roll())
}
//=== RUN Test_weightOperation_Roll
//weight_test.go:26: roll number : &{50 5 9}
//weight_test.go:26: roll number : &{30 3 0}
//weight_test.go:26: roll number : &{50 5 8}
//weight_test.go:26: roll number : &{40 4 9}
//weight_test.go:26: roll number : &{40 4 8}
//--- PASS: Test_weightOperation_Roll (0.00s)
}
根据以上代码我们可以看到,该权重工具使用了泛型,支持any数据类型,提供了随机种子的设置,常规的操作为以下接口
type IWeightData[T any] interface {
Data() T
Amount() int32
Ratio() int32
BaseRatio() int32
}
type IWeight[T any] interface {
// Roll
// @Description: 根据权重随机出一个数据,并且减少物品的数量
// @return T
//
Roll() (res IWeightData[T])
// AllItem
// @Description: 这里不会进行切片的拷贝,所以在使用的时候需要注意
// @return IWeightItem[T]
//
AllItem() []IWeightData[T]
}
type IWeightBuilder[T any] interface {
AddWeight(weightRatio, amount int32, data T) IWeightBuilder[T]
Build() IWeight[T]
Seed(seed uint64) IWeightBuilder[T]
}
在使用的时候,我们首先调用实例化一个Builder,调用AddWeight
添加权重项, 之后调用Build函数,实例化一个权重实例,这个实例使用IWeight
接口,所以我们可以直接调用Roll函数进行随机命中,当我们命中其中的项目时 会自动对数量做递减,并且如果数量为0的时候,不会再命中.最后会返回一个IWeightData
的数据,我们可以根据这个数据获得相关的基础数据.
Last modified: 02 March 2024