问题:两块广告牌,五个广告商,设计一个算法,在一段时间内五个广告商的广告出现次数为1:2:3:4:5,注意两个广告牌不能同时播同一个广告。
考虑只有一个广告牌,则只需要按照以下概率选择对应的广告播放即可
P=[115,215,315,415,515]P=[\frac{1}{15},\ \frac{2}{15},\ \frac{3}{15},\ \frac{4}{15},\ \frac{5}{15}] P=[151,152,153,154,155]
具体实现是通过轮盘赌算法
,即产生一个[0, 1)区间上的随机数rrr,根据rrr落在累积概率区间的位置选择对应的广告。累积概率为
Pcumsum=[115,315,615,1015,1515]P_{cumsum}=[\frac{1}{15} ,\ \frac{3}{15} ,\ \frac{6}{15} ,\ \frac{10}{15},\ \frac{15}{15}] Pcumsum=[151,153,156,1510,1515]
若r≤115r\leq\frac{1}{15}r≤151,则选择第1个广告;若115<r≤315\frac{1}{15}<r\leq \frac{3}{15}151<r≤153,则选择第2个广告;以此类推…
相应的实现代码为
from random import randomN = 1000000cnt_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'] += 1elif r<3/15:cnt_dict['2'] += 1elif r<6/15:cnt_dict['3'] += 1elif r<10/15:cnt_dict['4'] += 1else:cnt_dict['5'] += 1prob = [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,则以25\frac{2}{5}52的概率选择广告2在另一个广告牌播放,以35\frac{3}{5}53的概率选择广告3在另一个广告牌播放;若选择了广告2,则等概的选择1和4在另一广告牌播放,若选择了广告3,则选择广告4在另一广告牌播放。
具体实现如下
from random import randomN = 1000000cnt_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'] += 1cnt_dict['5'] += 1elif r<3/15:cnt_dict['2'] += 1if random()<1/2:cnt_dict['1'] += 1else:cnt_dict['4'] += 1elif r<6/15:cnt_dict['3'] += 1cnt_dict['4'] += 1elif r<10/15:cnt_dict['4'] += 1cnt_dict['5'] += 1else:cnt_dict['5'] += 1if random()<2/5:cnt_dict['2'] += 1else:cnt_dict['3'] += 1prob = [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)
如果觉得《一道腾讯 WXG 面试题》对你有帮助,请点赞、收藏,并留下你的观点哦!