http://blog.csdn.net/pipisorry/article/details/44491727
Question:(随机数相关)
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_id def 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)
二、
(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项和公式”的简单运算。
复杂度分析:
需要多少次才能成功选中一首歌的期望值
from:http://blog.csdn.net/pipisorry/article/details/44491727
ref:http://ask.julyedu.com/question/127
原文地址:http://blog.csdn.net/pipisorry/article/details/44491727