underthetwilight

[高中数学]数学期望

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)    收藏  举报

导航