DUT概率论与数理统计上机实习作业
发布时间:2012-12-01 15:15:17
发布时间:2012-12-01 15:15:17
概率论与数理统计上机实习题目
一、 某人写了n封信,又写了n个信封,然后将这n封信随机地装入这n个信封中,用Pn表示至少有一封信装对的概率。
1.编制程序,用随机数模拟至少20000次,求当n=10时,Pn的值。
2.重复第一步,画出n=2,3,…,50时,Pn的散点图。
解:
1.用C语言编程序。
以1~10的从小到大的排列为这10个信封的位置储存在数组a[10]中,用C语言中的随机数生成函数生成一组10个无重复的1~10之间的数的随机序列储存在数组b[10]中。把数组b中的元素从b[0]到b[9]分别与a[0]到a[9]比较大小,若比较到某一对元素相同则已可表示“至少有一封信装对”事件发生,停止本次试验并进行下一次试验,直至试验了20000次,用m来计算20000次试验中“至少有一封信装对”发生的次数。由程序运行的结果(见下图)可知n=10时Pn=0.628550
程序代码如下:
#include
#include
#include
int main()
{
int i,j,k,m=0,a[10]={1,2,3,4,5,6,7,8,9,10},b[10];//a[10]代表10封信.b[10]是10个信封,随机生成一组1~10的数.
double Pn;
time_t t;
srand((unsigned) time(&t));//用来生成随机数.
for(i=1;i<20001;i++)//进行20000次随机模拟;
{
printf("第%d次模拟试验中每封信的位置:",i);
for(j=0;j<10;j++)
{
b[j]=a[rand()%10];
k=0;
while(k
{
if(b[j]==b[k])
{
b[j]=a[rand()%10];
k=0;
}
else
k++;
}
printf("%3d",b[j]);//打印出来可以方便检查错误.
}
printf("\n");
for(j=0;j<10;j++)
{
if(b[j]==a[j])//检查信与信封是否配对.
{
m+=1;//一次模拟中一旦有一封信放对了则m增加1,不必再检查下去.
break;
}
else
continue;
}
}
Pn=1.0*m/20000;
printf("m=%d,Pn=%f\n",m,Pn);
}
2.求n为2~50的Pn与n=10时相同,只需把n=10修改成相应的数值即可。下表是n为2~50时的Pn值表:
由此表数据用Excel处理可得Pn的散点图如下:
二、 设X1,X2,…,Xn相互独立且都服从区间[0,1]上的均匀分布,为区间[0,1]上的一个可积函数由大数定律可知依概率收敛于=,编制程序,用随机数模拟至少40000次,近似地求下列两个积分的值:
,
解:
1.用C语言编写程序。利用随机数函数模拟45000次,得到45000个0~1之间的数(即Xi),用sum把它们的的值全部加和,再除以45000就是平均值.
程序代码如下:
#include
#include
#include
#include
int main()
{
int i;
double x,sum=0,e=2.718281828;
time_t t;
srand((unsigned) time(&t));
for (i=0;i<45000;i++)
{
x=(rand()%1001)/1000.0;//将生成的0-1000的随机数除以1000便是精度为0.001的0-1之间的随机数.
sum+=pow(e,x*x);//求45000个f(Xi)的和的值,再除以45000就是f(Xi)的平均值.
}
printf("%d次随机试验的f(Xi)的平均值=%f\n",i,sum/45000);
return 0;
}
程序运行结果如下:
所以≈1.461591.
2.用C语言编写程序。用随机数函数模拟45000次,得到45000个0~1之间的随机数Xi,将这些数的求和后再取平均值,就是所要求的的值。
程序代码:
#include
#include
#include
#include "math.h"
int main()
{
int i;
double x,sum=0;
srand((unsigned) time(0));
for (i=0;i<45000;i++)
{
x=(rand()%1001)/1000.0;
if(x==0) //此处防止生成的随机数太小接近于0,下一步求f(Xi)时发生除以0的错误.
x=0.0000001;
sum+=sin(x)/x;
}
printf("%d次随机试验的f(Xi)的平均值=%f\n",i,sum/45000);
}程序运行结果如下:
所以≈0.946260 .
三、 假设男、女婴的出生率均为0.5,每个家庭只要有一个男婴出生就不再生下一胎,如果没有男婴,不论已经出生多少女婴,都可以继续要下一胎。假设某地有100万个家庭,按照上述生育政策,自行编制程序回答以下问题:
1.每个家庭大约有几个小孩?
2.男女比例大约为多少?
3.如果男婴与女婴的出生率为0.51与0.49,重新回答前两问。
解:
1.第k胎为男孩的概率P=,所以每个家庭孩子数目的期望EX=.由于=1.56×10-28已经很小,后面的还会越来越小,所以只需要计算前100项就可以近似地代替.用C语言计算EX=的值,程序代码如下:
#include "stdio.h"
#include "math.h"
int main()
{
int k;
double m=0.5,EX=0;
for(k=1;k<=100;k++)
{
EX+=k*pow(m,k);
}
printf("EX=%f\n",EX);
}
程序运行结果如下:
可见EX=2 .即每个家庭大约有2个孩子。
2.每个家庭男孩数的期望EX1=,女孩数的期望EX2=(100万个家庭的男、女孩数分别就是106×EX1、106×EX2) .同(1)中的级数一样,这两个级数计算前100项即可近似地代替所有项.用C语言编写程序,代码如下:
#include "stdio.h"
#include "math.h"
int main()
{
int k;
double m=0.5,EX1=0,EX2=0,sum1,sum2;
for(k=1;k<=100;k++)
{
EX1+=pow(m,k);
EX2+=(k-1)*pow(m,k);
}
sum1=1000000*EX1; //sum1是男孩总数
sum2=1000000*EX2; //sum2是女孩总数
printf("男女比例=%f\n",sum1/sum2);
}
程序运行结果如下:
由此可知男女比例=1:1 .
3.
(1)第k胎为男孩的概率P=,每个家庭孩子数目的期望EX= .下面用C语言计算EX=,程序代码:
#include "stdio.h"
#include "math.h"
int main()
{
int k;
double m=0.51,n=0.49,EX=0;
for(k=1;k<=100;k++)
{
EX+=k*m*pow(n,k-1);
}
printf("EX=%f\n",EX);
}
运行结果如下:
所以此时每个家庭的孩子数约为1.960784 .
(2)EX1= ; EX2= .
用C语言求男孩总数和女孩总数,再求男女比例,程序代码如下:
#include "stdio.h"
#include "math.h"
int main()
{
int k;
double m=0.51,n=0.49,EX1=0,EX2=0,sum1,sum2;
for(k=1;k<=100;k++)
{
EX1+=m*pow(n,k-1);
EX2+=(k-1)*m*pow(n,k-1);
}
sum1=1000000*EX1; //sum1是男孩总数
sum2=1000000*EX2; //sum2是女孩总数
printf("男女比例=%f\n",sum1/sum2);
}
程序的运行结果如下:
所以此时的男女比例=1.040816