随机选择带权重的item

Question:随机播放音乐(随机数相关,带权重)

假设张三的mp3里有1000首歌,现在希望设计一种随机算法来随机播放。与普通随机模式不同的是,张三希望每首歌被随机到的改了吧是与一首歌的豆瓣评分(0~10分)成正比的,如item0评分为8.9分,item1评分为9.5分,则希望听item0的概率与item1的概率比为89:95,。现在我们已知这1000首歌的豆瓣评分。解决方案:一、def randomSelect(item_list):'''随机选择带权重的list中的某个item,并返回其下标(item_list权重和可以不为1):param item_list::return:'''accu_item_list = add.accumulate(item_list)# print(type(accu_item_list))random_select = random.random() * accu_item_list[-1]for accu_item_id, accu_item in enumerate(accu_item_list):if accu_item > random_select:return accu_item_iddef cal_ratio(item_list):'''计算每个item在item_list中的比重:param item_list::return:'''all_sum = sum(item_list)for i in item_list:print(i / all_sum)if __name__ == '__main__':item_list = [0.1, 0.4, 0.6, 0.8, 0.3]cal_ratio(item_list)item_list_all = []item_list_cnt = []for i in range(100000):selected_item_id = randomSelect(item_list)item_list_all.append(selected_item_id)for i in range(len(item_list)):item_list_cnt.append(item_list_all.count(i))cal_ratio(item_list_cnt)Note: 原理所有比重加和为accu_item_list[-1](可看成一维上的长度, 是所有item长度的和,且大比重的item长度相对更长), 在这个总长度上掷骰子,长度长的item选中概率大。

二、

(1)1000首歌曲编号,从1至1000(2)随机选择一首歌:产生一个1至1000的随机数,表示要播放的歌曲,这时,所有的歌曲被选中播放的概率是相同的(3)选定的歌播放与否:假设选定的歌曲是54号,它的豆瓣评分是9.5分,那么此时再随机生成一个1至100的随机数,如果随机数小于等于95,那么就播放这首歌曲,如果随机数大于95,则重复1,2,3的步骤,直至找到一首可以播放的歌曲备注:两首歌曲,评分分别为8.0,9.5,他们被选中的概率为1/1000,选中后还要产生一次随机数,被播放的概率分别为80%,95%,选中概率相同,播放概率比恰好是分数比值

详细解释:

重述算法本身:1、以[1,N]均匀分布产生随机数s;2、以[0,1]均与分布产生随机数q,若q<ps,则选择第s首歌,算法结束;否则,跳转到第1步。下面的研究对象,都是仅考察第i首音乐:假设它第n次被选中的概率为f(n),前n次被选中的概率为s(n),即s(n)=f(1)+f(2)+…+f(n)。显然有:f(n) = s(n) – s(n-1)第n+1次被选中的概率为:f(n+1) = (1-s(n))(1/N) * pi其中,1-s(n)表示前n次都没有被选中。从而:s(n)= 1 – (f(n+1) N/pi)令a = -N/pi,则:s(n) = af(n+1) + 1从而:s(n-1)=af(n) + 1两式相减,得到:f(n) = af(n+1) – af(n)从而:q = f(n+1) / f(n) = (1+a)/a = (N-1)/N而f(1)=pi/N从而,s(n) = f(1) / (1 – q) = pi结论仍然是:这种做法是对的。此外,虽然啰嗦了这么多,再说两点:1、通过上面的式子:f(n+1) / f(n) = (N-1)/N可以看出,其实第n+1次的概率比第n次的概率,是等比数列的。2、以上仅仅是高中“等比数列”“通项公式和前n项和公式”的简单运算。

复杂度分析:

需要多少次才能成功选中一首歌的期望值

这个期望值E只和歌曲列表的平均分A有关,如果选了无数次还没有成功命中的话,只能说明是听歌的人品位太差。。。。。夸张一点说,假如说某君从来没有成功定位过一首歌,说明他听的歌全都是0分哈哈哈哈哈哈哈哈所以,从这个角度考虑,这个算法还是有一定缺点的下面我来补充下我自己的想法吧,和其他已有的回答有相似之处,,大家看看就好假设列表里有1000首歌,每首歌的打分是0~100间的整数算法的时间复杂度即为折半查找的时间复杂度O(lgn),n是列表中歌曲的数目

from:

ref:

或许是某个未开发的荒凉小岛,或许是某座闻名遐迩的文化古城。

随机选择带权重的item

相关文章:

你感兴趣的文章:

标签云: