[高中数学]数学期望
1.数学期望的定义
如果离散型随机变量\(X\)的所有可能取值为\(x_1,x_2...x_n\)其出现的概率分别为\(p_1,p_2,...p_n\)那定义\(X\)的数学期望\(E(X)=\sum_i^n{x_ip_i}\)
注:如果一个随机变量的全部可能取值是有限个或可数无限个,那么这个随机变量就被称为离散型随机变量,上述的可数可理解为构造一个关于集合\(P\)和整数集\(N_*\)之间的双射\((Bijection)\),即一一映射
2.数学期望的性质
\((1).\) 常数的数学期望:\(\forall c \in R ,E(c)=c\)
\((2).\) 线性性
即\(E(\sum_i^n a_iX_i+c)=\sum_i^n a_iE(X_i)+c\)
注:该式实际表达了数学期望\(E(X)\)是一个线性函数
\((3).\) 独立变量的可乘性
对于两个独立变量\(X,Y\),有 \(E(XY)=E(X)E(Y)\)
\((4).\) 函数的数学期望
\(E(f(X))=\sum E(f(x_i))p_i\)
\((5).\) 数学期望与其他量的关系
\((I)\) 方差:\(Var(X)=E[(X−E[X])^2]\)
\((II) Jenson\)不等式:若\(\phi\)为凸函数,则\(E(\phi(x))\ge\phi(E(x))\)
3.数学期望的意义
\((1).\)数学期望描述了随机变量的集中趋势
\((2).\)数学期望本质上是概率为权重的加权平均值,出现概率越高的结果,对期望值的影响(权重)就越大
例如:你参加一个游戏,\(50%\)概率赢\(100\)元,\(50%\)概率输\(50\)元。
\(E(X)=0.5×100+0.5×(−50)=25\) 元。
这并不意味着你玩一次能赢25元,而是如果你玩很多次,平均每次大约赚25元
\((3).\)数学期望代表在测试样本足够大时,你的平均结果趋近于期望值
4.例题
\(T1\) \(\color{black}P10500 Rainbow 的信号\)
题意简述: 从\(1\)~\(n\)中任选两个整数\(l,r(if~~l>r,swap(l,r))\),计算长度为\(n\)的数列\(P\)中从\(l\)到\(r\)所有数的\(ans\) , \(or\) , \(xor\) 和
补充知识:
\(1.and\)运算的性质\(\forall x,x\neq 0,x\&1=x,x\&0=0,x\&y \le min(x,y)\)
\(2.or\)运算的性质\(\forall x,x\neq 0,x\|1=1,x\|0=x,x\|y\ge max(x,y)\)
\(3.xor\)运算的性质\(\forall x,x\neq 0,x\oplus 0=x, x\oplus x=0,x\oplus y=z\rightarrow y\oplus z=x\)\(\oplus\) 的逆运算是它本身
分析:
\(Step\) \(1:\) 概率
先考虑若\(l=r\),选到的概率为\(p=\frac{1}{n}\times \frac{1}{n}=\frac{1}{n^2}\)
如果\(l\neq r\)选到的概率为\(p=2\times\frac{1}{n}\times\frac{1}{n}=\frac{2}{n^2}\)
注:此处因为若\(l>r\)交换\(l,r\),故需乘\(2\)
\(Step\) \(2:\)期望
因为性质\((2)\),对于某个整数二进制下的第\(k\)位
,有\(E=2^k\times p\times x_i\)
\(Step\) \(3:and,or,xor\)
接下来分析 \(and\) , \(or\) , \(xor\)
注:以下的now均为当前位置
\(And:\)考虑数列从\(l\)到\(r\)中的二进制下的第\(k\)位,一定如下列形式

根据与运算的性质,我们有
因为跨过这一个\(0\)的序列贡献一定为\(0\),以现在的位置为右端点,左端点可在\((last,now)\)中任取,共有\(now-last-1\)种
\(Or:\)类似于\(And\),因为只要跨过一个\(1\),就有贡献为一,所以记录上一个为\(1\)的位置那么\([1,last1]\)的位置可以任取,如果当前位置也为1,则\([1,now)\)都是可选择的
\(Xor:\) 异或的处理是本题的难点,因为只有\(1\)会被计入贡献,所以我们实际上是需要解一个方程
\(a_l\oplus a_{l+1}....\oplus a_r=1\)
\(\rightarrow a_1\oplus...a_r=1\oplus a_1\oplus ...a_{l-1}\)
考虑前缀和,记\(s_i\)表示前缀异或和
\(\rightarrow s_{l-1}\oplus s_r=1\)
所以我们考虑两个数\(c_1,c_0\)分别表示\(s_{l-1}=1\)的\(l\)的数量和和\(s_{l-1}=0\)的\(l\)的数量和,若\(s_r=1\rightarrow E=2^k\times \frac{2}{n^2}\times c_0\)
\(s_r=0\rightarrow E=2^k\times \frac{2}{n^2}\times c_1\)
统计求和即可
$\large Code$
#include<bits/stdc++.h>
#define int long long
#define double long double
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-'){f=-1,ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
const int N=1e5+7;
int n,a[N],m,k[N][35],s[N];
void devide(int x,int id){
int i=1;
while(x>0){
k[id][i]=x&1;
x=x>>1;i++;
}
m=max(m,i-1);
}
double solveand(int id){
int t=(1<<id-1);double xs=t,E=0;int lst0=0;
for(int i=1;i<=n;i++){
if(k[i][id]==1){
int res=i-lst0-1;
E+=xs*(1.0+2.0*res)/(double)(n*n);
}
else lst0=i;
}
return E;
}
double solvexor(int id){
int t=(1<<id-1);double xs=t,E=0;int c0=1,c1=0;
int s=0;
for(int i=1;i<=n;i++){
s^=k[i][id];
// cout<<k[i][id]<<" "<<s<<" "<<c0<<" "<<c1<<"\n";
if(s==1){E+=xs*(double)(2*c0)/(double)(n*n);c1++;}
if(s==0){E+=xs*(double)(2*c1)/(double)(n*n);c0++;}
if(k[i][id]==1)E-=xs*(1.0)/(double)(n*n);
// cout<<E<<"\n";
}
return E;
}
double solveor(int id){
int t=(1<<id-1);double xs=t,E=0;int lst1=0;
for(int i=1;i<=n;i++){
if(k[i][id]==1){
lst1=i;
E+=xs*(1.0+2.0*(i-1))/(double)(n*n);
}
else E+=xs*(2.0*lst1)/(double)(n*n);
}
return E;
}
signed main(){
n=read();
for(int i=1;i<=n;i++){
a[i]=read();
devide(a[i],i);
}
double E1=0,E2=0,E3=0;
for(int i=1;i<=m;i++){
E1+=solvexor(i);
E2+=solveand(i);
E3+=solveor(i);
}
printf("%.3llf %.3llf %.3llf",E1,E2,E3);
return 0;
}
posted on 2026-04-04 20:07 Underthetwilight 阅读(70) 评论(0) 收藏 举报
浙公网安备 33010602011771号