1. 程式人生 > 其它 >筆記-概率與期望

筆記-概率與期望

概率與期望

我們把隨機試驗中的某種結果稱為樣本點,所有樣本點稱為樣本空間。隨機事件即為樣本空間的子集,即有若干樣本點構成的子集,隨機變數是把樣本點對映為實數的函式,分為離散和連續兩種,我們主要討論離散概率。

概率

對於樣本空間 \(S\) 隨機事件 \(A\),若 \(P(A) \ge 0\)\(P(S)=1\)\(A_1,A_2\dots\) 不相交,\(\sum P(A_i)=P(U A_i)\) 則稱 \(P(A)\) 為隨機事件 \(A\) 發生的概率。

通俗來講 \(P(A)=\frac{A發生的情況}{所有情況}\)

期望

若隨機變數的取值有 \(x_1,x_2\dots\),對於每個取值的概率為 \(p_1,p_2\dots\)

,則其數學期望為 \(E(X)=\sum p_ix_i\)。通俗來講,期望即為取值與概率乘積再求和。

舉個例子,投兩個色子,期望得到多少點。

樣本空間是由 \(36\) 形如 \((a,b)\) 的樣本點構成的。隨機變數的取值為 \(2,3,\dots,12\),概率分別為 \(\frac{1}{36},\frac{1}{18},\dots,\frac{1}{36}\),可以算得其期望為 \(E(x)=7\)

也就是說投兩個色字,我們期望得到的數是 \(7\)

性質

\(E(aX+bY)=a \times E(X) + b \times E(Y)\)

數學期望是個線性函式。

通過這個性質我們可以很容易地解決上述問題。設 \(X\)

為投一個色字的隨機變數,顯然 \(2X\) 為投兩個,而 \(E(X)=(1+2+3+4+5+6)/6=3.5\)\(E(2X)=7\)

例題

綠豆蛙的歸宿

\(dp[x]\) 代表 \(x\)\(n\) 的期望距離,根據期望的定義和性質,有 \(dp[x]=\sum_{(x,y) \in E} \frac{dp[y]+val(x,y)}{deg_x}\)。建反圖跑拓撲,放的時候只放 \(n\),顯然\(dp[n]=0\)

#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
template <typename T> void read(T &x) {
	T f = 1;
	char ch = getchar();
	for (; '0' > ch || ch > '9'; ch = getchar()) if (ch == '-') f = -1;
	for (x = 0; '0' <= ch && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
	x *= f;
}
struct node{
	int pre, to, val;
}edge[N << 1];
int head[N], tot;
int n, m, in[N], deg[N];
double dp[N];
queue<int> q;
void add_edge(int u, int v, int l) {
	edge[++tot] = node{head[u], v, l};
	head[u] = tot;
}
int main() {
	read(n); read(m);
	for (int i = 1, u, v, l; i <= m; i++) {
		read(u); read(v); read(l);
		add_edge(v, u, l);
		in[u]++;
		deg[u]++;
	}
	q.push(n);
	while (!q.empty()) {
		int x = q.front();
		q.pop();
		for (int i = head[x]; i; i = edge[i].pre) {
			#define y edge[i].to;
			dp[y] += 1.0 * (dp[x] + edge[i].val) / deg[y];
			in[y]--;
			if (in[y] == 0) q.push(y);
			#undef y
		}
	}
	printf("%.2lf", dp[1]);
	return 0;
}

更多例題後面再補吧。