【发布时间】:2019-09-20 04:25:22
【问题描述】:
我有以下算法
Step 1. 生成u1和u2~U(0,1)
第 2 步。定义 v1=2u1-1、v2=2u2-1 和 s=v1^2+v2^2
步骤 3。如果 s>1,返回步骤 1。
第 4 步。如果 s
这是我在 R 中实现此算法的方法:
PolarMethod1<-function(N)
{
x<-numeric(N)
y<-numeric(N)
z<-numeric(N)
i<-1
while(i<=N)
{u1<-runif(1)
u2<-runif(1)
v1<-(2*u1)-1
v2<-(2*u2)-1
s<-(v1^2)+(v2^2)
if(s<=1)
{
x[i]<-((-2*log(s)/s)^(1/2))*v1
y[i]<-((-2*log(s)/s)^(1/2))*v2
z[i]<-(x[i]+y[i])/sqrt(2) #standarization
i<-i+1
}
else
i<-i-1
}
return(z)
}
z<-PolarMethod1(10000)
hist(z,freq=F,nclass=10,ylab="Density",col="purple",xlab=" z values")
curve(dnorm(x),from=-3,to=3,add=TRUE)
幸运的是,该代码没有标记任何错误并且与N=1000 配合得很好,但是当我更改为N=10000 时,并没有更好地处理曲线显示:
与 N=1000 个显示器的对比:
这是为什么呢?
我的代码有问题吗?当N 增加时应该会更好地调整。
注意:我在代码中添加了z 以在输出中包含这两个变量。
【问题讨论】:
-
代码还正确返回了
N=1000z 值。
标签: r algorithm random plot statistics