求实验成功的平均期望

来源:互联网 发布:国家安全网络领导小组 编辑:程序博客网 时间:2024/05/16 08:43

这里写图片描述

假设每次用(不无聊,无聊)来表示当前状态。而不无聊加无聊的人数总和是一定的。经过一次交谈,有三种情况:
1. (i, j) –> (i, j) 选中的两个朋友都是无聊的。
2. (i, j) –> (i-1, j+1) 选中的一个朋友无聊,另一个不无聊的。
3. (i, j) –> (i-2, j+2) 选中的两个朋友都不无聊。

这三次选择的情况分别对应:
(1)从原来的 i 个人中选择2个。
(2)从 i 个人选1个,从 j 个人选1个。
(3)从原来的 j 个人中选择2个。

假设总共有t个人,从中选择两个人可能有t(t1)2中情况。
而发生这三种情况的概率为分别:
(1)i(i1)t(t1)
(2)2ijt(t1)
(3)j(j1)t(t1)

而从一个状态到达另一个状态,可以简化为二分类:保持当前状态或者发生改变。这就很有意思了。让人想起一个经典问题,有一枚硬币,假设抛掷为正面的概率为p,抛掷为负面的概率为1-p,一直抛掷直到出现正面才停下来,求抛掷的平均次数。很容易可以推导出公式为:2/p+1/(1-p)-1。

应用到当前问题,假设每次改变状态为成功事件,所需要的次数为2/p+1/(1-p)-1,其中p=j(j1)(i+j)(i+j1)。而每次改变有两种情况:无聊的人多一个或者多两个,发生的概率比为:2*i*j : i*(i-1)。

代码如下

import numpy as np#p表示成功的概率,求不到成功不停下来的实验次数的期望def times(p):    if p == 0:        return float('inf')    if p == 1:        return 1    return 2/p+1/(1-p)-1m_people = 40n_people = 50total_people = m_people + n_peoplepair_of_mn = np.zeros([total_people+1,total_people+1])#当只有一个有趣的人时,只要选中这个有趣的人实验就结束了#m = 0, 时间为0#m+n>1#m个有趣的人,n个无聊的人,0<m,n<=50#m总是在减少,n总是在增加,#m不会超过50个人,而n会m = 1n = total_people - mun_success = n*(n-1)/((m+n)*(m+n-1))pair_of_mn[m,n] = times(1-un_success)for i in range(2,m_people+1):    j = total_people - i    un_success = j*(j-1)/((i+j)*(i+j-1))    port_1 = 2*i*j/(2*i*j+i*(i-1))    port_2 = i*(i-1)/(2*i*j+i*(i-1))    pair_of_mn[i,j] = times(1-un_success) + port_1*pair_of_mn[i-1,j+1] + port_2*pair_of_mn[i-2,j+2]for i in range(1,m_people+1):#     print(i,total_people-i,pair_of_mn[i,total_people-i]-pair_of_mn[i-1,total_people-i+1])    print(i,total_people-i,pair_of_mn[i,total_people-i])
原创粉丝点击