数学期望

数学期望——某件事情大量发生之后的平均结果。

在概率论和统计学中,一个离散型随机变量的期望值是实验中每次可能结果的概率乘以其结果的总和。

数学期望_第1张图片

 例题:一项工作由甲一个人完成,平均需要4小时,而乙有0.4的概率来帮忙,两个人完成平均只要3小时。若用X表示完成这项工作的人数,用Y表示完成这项工作的期望时间,由于这项工作要么由一个人来完成,要么由两个人来完成,那么这项工作完成的期望时间E(Y)=P(X=1)E(Y|X=1)+P(X=2)E(Y|X=2)=(1-0.4)*4+0.4*3=3.6.

P1291 [SHOI2002]百事世界杯之旅

传送门

题解:

一、对每一步暴力极限求解。(重要)

令 f[i] 表示已经买到 i 个球星的期望购买次数。

我们由 f[i]推 f[i+1]

下一次购买可以买到不同球星的概率是(n-i)/n

下两次购买可以买到不同球星的概率是 i/n*(n-i)/n注意到这时第一次买到的情况已经忽略了

...

下 k 次购买可以买到不同球星的概率是(i/n)^(k-1)*(n-i)/n

假设第 k 次就是正无穷次

则此步的期望即为

则有

错位相减

此步中采用极限的思想丢了一些 00 的项,用“ ≈ ”表示采用极限思想,实际上极限是准确值,不需要“ ≈ ”,此处只是为了标示,下同。

由等比数列公式

数学期望_第2张图片

所以我们得出

二、神奇的自己推自己的方法(目前处于懵逼状态)

同样令f[i]f[i]表示已经买到ii个球星的期望购买次数。

如果从上一个推过来,为

f[i]+=(f[i−1]+1)×n−(i−1)/n

如果从当前推过来,为

f[i]+=(f[i]+1)×i/n

发现概率之和并不等于1,也就是说,这样写是有问题的。

从上一个推过来肯定没问题,我们考虑从当前推当前的意义。

“买了一个,买的是自己有的的概率”

然而我们考虑最开始说的一句话

“当已经买到所有的名字以后,是不需要再买的。”

也就是说,我们这样写可能把自己买了很多遍,而事实上是并不需要再买的。

于是我们修改一下意义

为“买了一个,买的是自己有的且不是自己的概率”

则推过来就是

f[i]+=(f[i]+1)×(i−1)/n

那我们这个什么时候买呢?

极限的思想,在最后买时,对期望的影响是微乎其微的

把这两项加起来并化简

就得到了

f[i]=f[i−1]+n/(n−i+1)

和上一个方法的结果是一样的

关于合并两个值并不是一样的f[i],用的也是极限的思想

附上代码:


#include

using namespace std;

typedef long long LL;

inline int read() {
    int k = 0 , f = 1 ; char c = getchar() ;
    for( ; !isdigit(c) ; c = getchar())
      if(c == '-') f = -1 ;
    for( ; isdigit(c) ; c = getchar())
      k = k*10 + c-'0' ;
    return k*f ;
}

inline LL gcd(LL a,LL b) 
{
    if(a < b) swap(a,b) ; 
    return !b ? a : gcd(b,a%b);
}

int main() 
{
    int n;
    n = read() ; 
    LL nowfz = n, nowfm = 1 ;
    LL fz, fm ;
    for(int i=2;i<=n;i++) {
        fz = n, fm = i ;
        LL gg = gcd(fm,nowfm) ;
        nowfz = nowfz*(fm/gg) + fz*(nowfm/gg) ; nowfm *= (fm/gg) ;
        gg = gcd(nowfz,nowfm) ;
        nowfz /= gg, nowfm /= gg ;
    }
    if(nowfm == 1) {
        printf("%lld",nowfz) ; 
        return 0 ;
    }
    LL x = nowfz / nowfm ; 
    nowfz %= nowfm ;
    LL xx = x,hh = 0 ;
    while(xx){
        hh++;
        xx /= 10 ;
    } 
    for(int i=1;i<=hh;i++){
        printf(" ") ;
    }  
    printf("%lld\n",nowfz) ;
    if(x){
        printf("%lld",x) ;
    } 
    xx = nowfm ;
    while(xx){
        printf("-");
         xx /= 10 ;
    }  
    printf("\n") ;
    for(int i=1;i<=hh;i++){
        printf(" ") ;
    }  
    printf("%lld",nowfm) ;
    return 0 ;
}

 

你可能感兴趣的:(概率与期望)