R语言中随机模拟的例子PPT资料.ppt
《R语言中随机模拟的例子PPT资料.ppt》由会员分享,可在线阅读,更多相关《R语言中随机模拟的例子PPT资料.ppt(40页珍藏版)》请在冰豆网上搜索。
,问题分析在一次实验中,如果第一次选择选中了轿车(概率为1/3),那么主持人打开一扇门后,如果坚持原来的选择,则能得到轿车,反之,改变第一次选择则不能得到轿车。
如果第一次没有选中轿车(概率为2/3),那么其余两扇门后面必有一个是轿车,主持人只能打开有山羊有那扇门,则剩下的一扇门后面是轿车,此时坚持原来的选择不能得到轿车,改变第一次的选择必能得到轿车。
因此,经过分析,坚持第一次的选择不变得到轿车的概率为1/3,改变第一次的选择得到轿车的概率为2/3。
实际上,在只有三扇门的情况下,那么改不改变选择效果并不明显。
如果有100扇门,参与的嘉宾选择了其中的一扇,而主持人随后把剩下的99扇门中间的98扇门都打开,这98扇门后面都没有奖品,这时应该改变选择,毕竟最开始自己选择的那扇门中奖的概率只是1%而已。
需要注意的是,主持人是在知道其他两扇门后面都有什么的情况下选择一个门打开的。
这种情况下三个门后是轿车的概率因为主持人知道结果并参与其中而关联在一起,而不是孤立等同的。
如果打开门的不是主持人,而是另一个参与者,并且当他打开门时发现什么也没有,那么,剩下的两个门后是轿车的概率才是相等的。
计算机模拟为了验证这一结果,我们就要比较不改变选择中奖的几率和改变选择中奖的几率。
模拟方法是:
我们从0,1,2这3个数中随机一个为轿车(即中奖号码),另随机一个数为你的选择。
如果你的选择与中奖号相同,则计这次为不改变选择中奖;
如果你的选择不对,则是改变选择中奖。
分别累积出不改变选择中奖和改变选择中奖的次数,就可以得到不改变选择中奖的几率和改变选择中奖的几率了。
为了将结果表示的明显,我们可以假设有100扇门,参与的嘉宾选择了其中的一扇,而主持人随后把剩下的99扇门中间的98扇门都打开,这98扇门后面都没有奖品,然后模拟并比较不改变选择中奖的几率和改变选择中奖的几率。
此时的情况也是相同的,只是每次随即都是从0到99中随机数而已。
程序:
f=function(n)stick=0;
alter=0;
x=floor(runif(n,min=0,max=3)+1);
y=floor(runif(n,min=0,max=3)+1);
for(iin1:
n)x=floor(runif(1,min=0,max=3)+1);
y=floor(runif(1,min=0,max=3)+1);
if(x=y)stick=stick+1elsealter=alter+1;
stick=stick/n;
alter=alter/n;
print(data.frame(trial=n,stick=stick,alter=alter);
9)f(i*104),结果为:
trialstickalter1100000.33240.6676trialstickalter1200000.32890.6711trialstickalter1300000.33133330.6686667trialstickalter1400000.3314750.668525trialstickalter1500000.332580.66742trialstickalter1600000.33451670.6654833trialstickalter1700000.33251430.6674857trialstickalter1800000.33161250.6683875trialstickalter1900000.33204440.6679556,对应的100个选择的程序为f=function(n)stick=0;
n)x=floor(runif(1,min=0,max=100)+1);
y=floor(runif(1,min=0,max=100)+1);
trialstickalter1100000.00940.9906trialstickalter1200000.010050.98995trialstickalter1300000.0095333330.9904667trialstickalter1400000.01010.9899trialstickalter1500000.010180.98982trialstickalter1600000.01050.9895trialstickalter1700000.0095428570.9904571trialstickalter1800000.01008750.9899125trialstickalter1900000.0096111110.9903889,当模拟的次数逐渐的增多时,其模拟值越接近理论值,这说明模拟的效果越好。
在随机事件的大量重复出现中,往往呈现几乎必然的规律,这个规律就是大数定律。
通俗地说,这个定理就是,在试验不变的条件下,重复试验多次,随机事件的频率近似于它的概率。
偶然必然中包含着必然。
此次模拟试验也正好用实际的模拟例子说明了大数定理的正确性和应用性。
问题二蒲丰投针问题,1777年法国科学家蒲丰提出的一种计算圆周率的方法-随机投针法,这种方法的具体步骤是:
1、取一张白纸,在上面画上许多条间距为d的平行直线。
2、取一根长为l(ld)的针,随机向画有平行直线的纸上掷n次,观察针与直线相交的次数,记为m。
3、计算针与直线相交的概率,问题分析针与平行线相交的充要条件是:
xl*sin/2,其中0xd/2,0建立直角坐标系(,x),上述条件在坐标系下将是曲线所围成的曲边梯形区域:
由几何概率知:
程序为:
f=function(n)d=2;
l=1.5;
m=0;
n)x=runif(1,min=0,max=d/2);
theta=runif(1,min=0,max=pi);
if(x=l*sin(theta)/2)m=m+1;
estimate=2*l*n/(m*d);
result=data.frame(num=n,estimate=estimate)print(result);
for(iin2:
5)f(10i),结果为:
numestimate11003.125numestimate110002.946955numestimate1100003.111388numestimate11e+053.14327可见,模拟的次数越多,所得的结果就越准确。
这与理论所知的结果是一样的。
问题三掷骰子问题,掷三只相同的色子,求至少有两个点数相同的概率。
问题分析构造3个整数随机变量,使之服从1到6之间的均匀分布,比较每次模拟出的3个值,如果至少有两个相同,则将成功的次数加1,分析可知,成功的频率即为所求的概率。
f=function(n)success=0;
n)x=floor(runif
(1)*6+1);
y=floor(runif
(1)*6+1);
z=floor(runif
(1)*6+1);
if(x=y|x=z|y=z)success=success+1;
p=success/n;
print(data.frame(num=n,p=p);
mm=proc.time();
9)f(i*104);
proc.time()-mm,结果为:
nump1200000.4447nump1300000.4428333nump1400000.441525nump1500000.44162nump1600000.4456667nump1700000.4445857nump1800000.4463875nump1900000.4451111proc.time()-mm用户系统流逝11.190.0314.23由概率知识可知:
P=1-(4*5*6)/(6*6*6)=5/9=0.4445。
这与以上模拟出的值基本上是一样的。
问题四无记忆性的例子,考虑有两个营业员的邮局。
假设当Smith先生进入邮局的时候,他看到两个营业员分别在为Jones先生和Brown先生服务,并且被告知先服务完的营业员即将为他服务。
再假设为每顾客服务的时间都服从参数为lambda的指数分布。
1).求这三个顾客中Smith最后离开邮局的概率?
Jones和Brown呢?
2).求Smith在邮局花费的平均时间ET?
问题分析当Smith接受服务的时候,Jones和Brown只有一个人离开,另一人仍在接受服务。
然而,由指数分布的无记忆性,从现在起剩下的这个人被服务的时间是参数为lambda的指数分布,即与Smith是同分布的。
再由对称性,他与Smith先离开的概率一样,都为1/2。
第1问答案为1/2,1/4,1/4。
ET=EminX;
Y+S=1/(2*)+1/,其中S为Smith服务花费的时间,X;
Y分别为Jones和Brown服务所花费的时间。
f=function(lambda,n=105)jones=0;
brown=0;
smith=0;
sumT=0;
n)t1=-log(runif
(1)/lambda;
t2=-log(runif
(1)/lambda;
t3=-log(runif
(1)/lambda;
if(t1+t3t2)brown=brown+1;
t=t1+t3;
elseif(t2+t3t1)jones=jones+1;
t=t2+t3;
elsesmith=smith+1;
t=t3+min(t1,t2);
sumT=sumT+t;
simth=smith/n;
jones=jones/n;
brown=brown/n;
ET=sumT/n;
ETreal=3/(2*lambda);
#真是的值print(data.frame(smith=smith,jones=jones,brown=brown,ET=ET,ETreal=ETreal)for(iin1:
9)f(3,i*103),结果为:
smithjonesbrownETETreal15060.2320.2620.4931070.5smithjonesbrownETETreal19790.2640.24650.49383580.5smithjonesbrownETETreal114590.25