权重概率问题-根据value的权重随机求key

根据权重设计抽奖系统算法

题目要求:
定义一个keystringvalueint类型的map,分别表示奖项和对应的权重,请你根据value权重设计一个抽奖系统。

我们可以将问题转化为概率区间映射问题,通过构建累计权重区间,在区间内生成随机数,选择区间。

具体代码实现:

func WeightedRandomChoice(d map[string]int) (string, error) { 
	// 分别存储区间i对应的key,以及累计权重区间的右端点
    keys := make([]string, 0)  
    sum := make([]int, 0)  
  
    curSum := 0  
    for k, v := range d {  
       curSum += v  
       keys = append(keys, k)  
       sum = append(sum, curSum)  
    }  
    // 在区间中生成随机数
    r := rand.Intn(sum[len(sum)-1])  
    // 通过二分查找随机数掉落在哪个区间
    index := sort.Search(len(sum), func(i int) bool {  
       return sum[i] > r  
    })  
  
    return keys[index], nil  
}  
  
func main() {  
    weights := map[string]int{  
       "Apple":  2,  
       "Banana": 3,  
       "Cherry": 5,  
    }  
  
    result, err := WeightedRandomChoice(weights)  
    if err != nil {  
       fmt.Println("Error:", err)  
       return  
    }  
    fmt.Println("随机选择结果:", result)  
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值