DUT概率论与数理统计上机实习作业

发布时间: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=10Pn=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.n2~50Pnn=10时相同,只需把n=10修改成相应的数值即可。下表是n2~50时的Pn值表:

由此表数据用Excel处理可得Pn的散点图如下:

二、 X1,X2,,Xn相互独立且都服从区间[0,1]上的均匀分布,为区间[0,1]上的一个可积函数由大数定律可知依概率收敛于=,编制程序,用随机数模拟至少40000次,近似地求下列两个积分的值:

解:

1.C语言编写程序。利用随机数函数模拟45000次,得到450000~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.0010-1之间的随机数.

sum+=pow(e,x*x);//45000f(Xi)的和的值,再除以45000就是f(Xi)的平均值.

}

printf("%d次随机试验的f(Xi)的平均值=%f\n",i,sum/45000);

return 0;

}

程序运行结果如下:

所以1.461591.

2.C语言编写程序。用随机数函数模拟45000次,得到450000~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.510.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×EX1106×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

DUT概率论与数理统计上机实习作业

相关推荐