Hello,大家好
这是第三期概率论与数理统计的学习,我将用这篇博客来整理我所学习的内容,及用C语言去做例题的过程。
那么这一期要学习的是随机变量的定义和离散型随机变量。还是一样,先总结知识点在再进行C语言案例实现。
啥是随机变量?
我们常把随机试验的结果与实数对应起来,也就是把随机试验的结果进行数量化。那么什么又是数量化呢?不要着急,先给出随机变量的定义:
定义:设 E E E是随机试验, Ω \Omega Ω是其样本空间。如果对于每个 w ∈ Ω w \in \Omega w∈Ω,总有一个实数 X ( w ) X(w) X(w)与之对应,则称 Ω \Omega Ω上的实值函数 X ( w ) X(w) X(w)为 E E E的一个随机变量。
从定义可以知道,随机变量是一个函数,它的自变量是随机试验的结果(也就是样本点)。那么随机试验结果的数量化就是将这个结果用某个具体的值来替代。例如,我们进行一次掷硬币的试验,它的结果只有正面朝上( w 1 w_{1} w1)或反面朝上( w 2 w_{2} w2),然后再用1来表示正面朝上,0表示反面朝上,于是就有: X ( w 1 ) = 1 , X ( w 2 ) = 0 X(w_{1})=1,X(w_{2})=0 X(w1)=1,X(w2)=0,这就是所谓的数量化。
如果将 X ( w ) X(w) X(w)简记为 X X X,且试验的所有结果( w 1 , w 2 , . . . , w n w_{1},w_{2},...,w_{n} w1,w2,...,wn)都能用一个具体的实数( X ( w 1 ) , X ( w 2 ) , . . , X ( w n ) X(w_{1}),X(w_{2}),..,X(w_{n}) X(w1),X(w2),..,X(wn))来表示,则可用随机变量 X X X来描述随机事件。要注意 X X X是表示一个函数!!!!
下面再举例说明:
例如掷硬币中,可用 X = 1 X=1 X=1表示 w 1 w_{1} w1:正面朝上,用 X = 0 X=0 X=0表示 w 2 w_{2} w2:反面朝上。那么 P ( X = 1 ) P(X=1) P(X=1)就表示正面朝上的概率, P ( X = 0 ) P(X=0) P(X=0)表示反面朝上的概率。
总结:之前我们都是用语言来具体描述一个试验的结果(也就是一个随机事件),引入随机变量后我们就可以用一个具体的值来表示一个随机事件(其实也不一定是具体的值,例如掷骰子中, X ≤ 4 X\leq4 X≤4就可以表示掷到的点数小于4这一事件)。
随机变量也有很多种类型,常见的随机变量,根据其可能取值的整体情况,分为两大类:离散型和连续型。那么我们首先介绍介绍离散型~
离散离散,啥是离散?科学的解释即连续的反义词就是离散,离散就是不连续。
那么对于随机变量 X X X,如果它只可能取有限个或可列无限个(虽然是无限个,但可以一个一个地排列起来)值,则称其为离散型随机变量。
这样说得我都有点摸不着头脑了,还是举几个例子:
那么再举一个连续性随机变量的例子作为对比:
例如,灯泡的使用寿命,对于随机变量 X X X,它的取值不能一个一个地排列,而是充满了一个区间,所以 X X X是连续性随机变量。
设离散型随机变量 X X X所有可能取的值为 x 1 , x 2 , . . . x_{1},x_{2},... x1,x2,...。
那么有 P { X = x k } = p k , k = 1 , 2 , . . . P\{X=x_{k}\}=p_{k},k=1,2,... P{X=xk}=pk,k=1,2,...
这些 p k p_{k} pk满足:
{ p k ≥ 0 , k = 1 , 2 , . . . ∑ k = 1 ∞ p k = 1 \begin{cases} p_{k}\geq 0,k=1,2,...\\ \sum_{k=1}^\infty p_{k}=1\\ \end{cases} {pk≥0,k=1,2,...∑k=1∞pk=1
概率分布体现了随机变量取各个可能值得概率的分布情况。
若随机变量 X X X只可能取0或1两个值,其概率分布为 0<p<1,q=1−p
P { X = 1 } = p P\{X=1\}=p P{X=1}=p
P { X = 0 } = q P\{X=0\}=q P{X=0}=q
其中, 0 < p < 1 , q = 1 − p 0
首先记住,二项分布就是一次试验只有两种结果,将这个试验进行n次。
将试验 E E E在相同条件下重复进行n次,每次的结果都相互独立,即每次试验结果出现的概率都不依赖于其它各次试验的结果,则称这n次试验是相互独立的。
设试验 E E E只有两个结果: A A A和 A ‾ \overline A A,记 P ( A ) = p , P ( A ‾ ) = 1 − p , 0 < p < 1 P(A)=p,P(\overline A)=1-p,0 P(A)=p,P(A)=1−p,0<p<1
下面给出二项式的公式: P { X = k } = C n k p k ( 1 − p ) n − k P\{X=k\}=C_{n}^kp^k(1-p)^{n-k} P{X=k}=Cnkpk(1−p)n−k
该公式的意义就是:进行n次试验,有 k k k次结果为 A A A的概率。
记为 X X X~ B ( n , p ) B(n,p) B(n,p)
如果随机变量 X X X的概率分布为: P { X = k } = λ k k ! e − λ , k = 0 , 1 , 2 P\{X=k\}=\frac{\lambda^k}{k!}e^{-\lambda},k=0,1,2 P{X=k}=k!λke−λ,k=0,1,2
那么就称随机变量 X X X服从参数为 λ \lambda λ的播=泊松分布,记为 X X X~ P ( λ ) P(\lambda) P(λ)
λ \lambda λ是啥?它是一个常数,经常题目中会给出。这里就不多做讨论了,下面开始C语言案例的实现!!!!
在做题之前呢,首先写出要三种常见的离散型随机变量的概率分布的算法,别怕难!你难我也难
那么首先是两点分布(Two-Point Distrubution),可别看它简单啊,一样要动手写一些:
// m denotes the one of the two results ——m代表两种结果的一种结果
// n denotes the another result ——n代表两种结果中的另一种
void TPDistrbution(float m,float n)
{
// p denotes the posibility of m; ——p代表m发生的概率
// q denotes the posibilitu of n; ——q代表n发生的概率,也就是1-p
float p = m / (m + n);
float q = n / (m + n);
printf("The posibility of m is :%f.\n",p);
printf("The posibility of n is :%f.",q);
}
然后呢就是二项分布(Binary Distrubution):
#include
// combined algorithms ——组合算法
// it means the results of select m items in n items ——从n个中选m个的可能性
int Combination(int n,int m)
{
int sum = 1,p = 1;
for( ; m > 0 ; m--)
{
sum *= n--;
p *= m;
}
return sum/p;
}
// in n tests,the result you expect will happen k times ——n次试验中,你期待的结果发生了k次
// and in one test,the posibility of it is p ——一次试验中,你期待的结果发生的概率为p
float BinDistrubution(int n,int k,float p)
{
float _P;
_P = Combination(n,k);
for(int i = 0 ; i < k ; i++)
_P *= p;
for(int i = 0 ; i < n - k ; i++)
_P *= (1 - p);
return _P;
}
int main()
{
// in five shooting tests,calculate the the posibility that you only make two shots ——在5次射击中,求你只射中两次的概率
// the posibility of every time you make shot is 0.6 ———你每一次试验的概率为0.6
float P = BinDistrubution(5,2,0.6);
printf("%f",P);
return 0;
}
紧接着就是那个啥泊松分布,不过这个泊松分布设计到了自然数 e e e,它的后面可是有好多位小数的啊
不过咱自然不能服输,用C语言将 e e e求出来!
首先呢,我们要知道 e e e的计算公式: e = ∑ n = 0 ∞ 1 n ! e=\sum_{n=0}^\infty\frac{1}{n!} e=n=0∑∞n!1
同时我们也不能取 e e e小数点后面的全部哇,所以只需要精确到小数点后6位即可。
#include
float Figure_e(int n)
{
float e = 1;
int sum = 1;
for(int i = 1 ; i <= n ; i++)
{
sum *= i;
e += 1.0 / sum;
}
return e;
}
int main()
{
float a = Figure_e(20);
printf("%.6f",a);
return 0;
}
好!
go on!
泊松分布(Poisson Distrubution):
#include
#include
float Figure_e()
{
float e = 1;
int sum = 1;
for(int i = 1 ; i <= 20 ; i++)
{
sum *= i;
e += 1.0 / sum;
}
return e;
}
// w denotes the parameter,and k denotes the result you expect ——w表示参数λ,k表示你所期待的结果
float PoiDistrubution(float w,int k)
{
// figure out e first ——先把e算出来
float e = Figure_e();
// _P denotes the posibility of the result that you expect to happen ——_P表示你所期望的结果发生的概率
float _P;
// first figure out w to the k ——先将参数λ的k次方计算出来
if(k == 0)
_P = 1;
else
_P = pow(w,k);
// cause w might be less than 1,so we better use the library function ——因为λ可能小于1,所以我们用库函数来求e的负λ次方
_P *= 1.0 / pow(e,w);
// according to the poisson formula,we need to divide by k! ——根据泊松公式,我们还需要除以k的阶乘
int sum = 1;
for(int i = 1 ; i <= k ; i++)
{
sum *= i;
}
_P /= sum;
return _P;
}
各种分布的代码有了,开始实战。
1)
#include
int main()
{
// A1 denotes the possibility of one of the relays was plugged on,and A2 denotes the posibility of another was plugged.
// A1表示其中一个继电器被接通的概率,A2表示另一个继电器被接通的概率
float A1,A2;
// p denotes the posibility that the relay was plugged on ——p表示继电器被接通的概率
float p = 0.8;
// use an array to store the possibility distrubution ——用一个数组来存储概率分布
float a[3] = {0};
// use poss to record the possbility every time we have judged if the relay was plugged on ——用poss来记录每次判断一个继电器被接通或未被接通的概率
float poss = 1;
// 0 denotes the relay wasn't plugged ——0表示继电器未被接通
// 1 denotes the relay was plugged ——1表示继电器被接通
for(int i = 0 ; i < 2 ; i++)
{
i == 0 ? (poss *= 1 - p) : (poss *= p);
for(int j = 0 ; j < 2 ; j++)
{
j == 0 ? (poss *= 1 - p) : (poss *= p);
a[i + j] += poss;
j == 0 ? (poss /= 1 - p) : (poss /= p);
}
i == 0 ? (poss /= 1 - p) : (poss /= p);
}
for(int i = 0 ; i < 3 ; i++)
printf("X = %d,p%d = %.2f\n",i,i,a[i]);
return 0;
}
2)分析:什么情况线路被接通?因为这两个继电器是并联的,所以任意一个被接通整个线路就可以被接通。也就是说我们排除它不被接通的情况即可。当然我们也可以求它被接通的所有情况(只需对上述代码稍作改动)。这里的做法是求出它被连通的所有情况的概率总和。
#include
int main()
{
float A1,A2;
float p = 0.8;
float poss1 = 1,poss2 = 0;
for(int i = 0 ; i < 2 ; i++)
{
i == 0 ? (poss1 *= 1 - p) : (poss1 *= p);
for(int j = 0 ; j < 2 ; j++)
{
j == 0 ? (poss1 *= 1 - p) : (poss1 *= p);
if(i + j >= 1)
poss2 += poss1;
j == 0 ? (poss1 /= 1 - p) : (poss1 /= p);
}
i == 0 ? (poss1 /= 1 - p) : (poss1 /= p);
}
printf("The possbility of the incident X>=1 is :%.2f.",poss2);
return 0;
}
分析:相当于是将观察辆出租车一天是否出现故障看成一次试验。每辆出租车是否出现故障与其它出租车故障无关。也就是说这个题是一个二项分布。
int main()
{
// p denotes the possibility that the car breaks down ——p表示一辆出租车出现故障的概率
float p = 0.02;
printf("The possibility of the incident that no cars break down is :%f",BinDistrubution(400,0,p));
return 0;
}
分析:因为它一天内发生火灾的次数没有上限,所以我们最好是排除它一天发生三次火灾一下的概率。
int main()
{
float w = 0.8;
float poss = 1 - PoiDistrubution(w,0) - PoiDistrubution(w,1) - PoiDistrubution(w,2);
printf("The possibility of the incident X>=3 is : %f.",poss);
return 0;
}