一道腾讯 WXG 面试题

问题:两块广告牌,五个广告商,设计一个算法,在一段时间内五个广告商的广告出现次数为1:2:3:4:5,注意两个广告牌不能同时播同一个广告。

考虑只有一个广告牌,则只需要按照以下概率选择对应的广告播放即可
P = [ 1 15 ,   2 15 ,   3 15 ,   4 15 ,   5 15 ] P=[\frac{1}{15},\ \frac{2}{15},\ \frac{3}{15},\ \frac{4}{15},\ \frac{5}{15}] P=[151, 152, 153, 154, 155]
具体实现是通过轮盘赌算法,即产生一个[0, 1)区间上的随机数 r r r,根据 r r r落在累积概率区间的位置选择对应的广告。累积概率为
P c u m s u m = [ 1 15 ,   3 15 ,   6 15 ,   10 15 ,   15 15 ] P_{cumsum}=[\frac{1}{15} ,\ \frac{3}{15} ,\ \frac{6}{15} ,\ \frac{10}{15},\ \frac{15}{15}] Pcumsum=[151, 153, 156, 1510, 1515]
r ≤ 1 15 r\leq\frac{1}{15} r151,则选择第1个广告;若 1 15 < r ≤ 3 15 \frac{1}{15}<r\leq \frac{3}{15} 151<r153,则选择第2个广告;以此类推…
相应的实现代码为

from random import random

N = 1000000
cnt_dict = {'1':0, '2':0, '3':0, '4':0, '5':0}

for i in range(N):
    r = random()
    if r<1/15:
        cnt_dict['1'] += 1
    elif r<3/15:
        cnt_dict['2'] += 1
    elif r<6/15:
        cnt_dict['3'] += 1
    elif r<10/15:
        cnt_dict['4'] += 1
    else:
        cnt_dict['5'] += 1

prob = [float('{:.3f}'.format(ele/sum(cnt_dict.values()))) for ele in cnt_dict.values()]
prob_required = [float('{:.3f}'.format(i/15)) for i in range(1,6)]

print(prob_required)
print(prob)

现在考虑有2个广告牌的情况,若没有2个广告牌不能同时播放同一广告这一限制,那么只需要两个广告牌相互独立地进行上面的操作即可。但题目要求两个广告牌不能同时播放相同的广告,考虑让其中的一个广告牌按照上面的方法先选择一个广告播放,然后在剩下的广告中按照某种概率选择出一个在另外一个广告牌播放。一种实现方法是,若选择了广告1和4,则另外一个广告牌播放广告5;若选择了5,则以 2 5 \frac{2}{5} 52的概率选择广告2在另一个广告牌播放,以 3 5 \frac{3}{5} 53的概率选择广告3在另一个广告牌播放;若选择了广告2,则等概的选择1和4在另一广告牌播放,若选择了广告3,则选择广告4在另一广告牌播放。
具体实现如下

from random import random

N = 1000000
cnt_dict = {'1':0, '2':0, '3':0, '4':0, '5':0}

for i in range(N):
    r = random()
    if r<1/15:
        cnt_dict['1'] += 1
        cnt_dict['5'] += 1
    elif r<3/15:
        cnt_dict['2'] += 1
        if random()<1/2:
            cnt_dict['1'] += 1
        else:
            cnt_dict['4'] += 1
    elif r<6/15:
        cnt_dict['3'] += 1
        cnt_dict['4'] += 1
    elif r<10/15:
        cnt_dict['4'] += 1
        cnt_dict['5'] += 1
    else:
        cnt_dict['5'] += 1
        if random()<2/5:
            cnt_dict['2'] += 1
        else:
            cnt_dict['3'] += 1
            
prob = [float('{:.3f}'.format(ele/sum(cnt_dict.values()))) for ele in cnt_dict.values()]
prob_required = [float('{:.3f}'.format(i/15)) for i in range(1,6)]

print(prob_required)
print(prob)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值