package comm import "math/rand" type WeightItem struct { Id interface{} Weight int } // ๆƒ้‡้กน็›ฎ type WeightedRandom struct { items []*WeightItem totalWeight int } func NewWeightedRandom(items []*WeightItem) *WeightedRandom { wr := &WeightedRandom{items: items} for _, item := range wr.items { wr.totalWeight += int(item.Weight) } return wr } func (wr *WeightedRandom) Pick() *WeightItem { if wr.totalWeight <= 0 { return nil } randomNumber := rand.Intn(wr.totalWeight) for _, item := range wr.items { if randomNumber < int(item.Weight) { return item } randomNumber -= int(item.Weight) } return nil }