这是一个非常具体的问题,但我使用验收拒绝算法尝试从两个镜像指数生成标准正态随机变量。代码如下:
N=10000;
a=1.315;
acceptances = 0;
no_of_loops = 0;
while acceptances<N
no_of_loops = no_of_loops + 1;
U1 = rand;
U2 = rand;
U3 = rand;
if U1>0.5
Y=log(U2);
if U3<=(1/a)*(sqrt(2/pi))*(exp((-(Y^2)/2)-Y)) % Acceptance condition
acceptances = acceptances + 1;
X(no_of_loops) = Y;
end
elseif U1<0.5
Y=-log(U2);
if U3<=(1/a)*(sqrt(2/pi))*(exp((-(Y^2)/2)+Y)) % Acceptance condition
acceptances = acceptances + 1;
X(no_of_loops) = Y;
end
end
end
mean_X = mean(X) % Mean is close to 0 as expected
variance_X = (var(X)) % Variance is coming out to be 0.7 rather than 1
variance_X
的出现是0.7而不是1.我知道我使用Exponential的事实不是问题,因为这是一个久经考验的算法,但我认为我的代码可能是错误的。谢谢。
我使用的是与PDF
的第3页相同的想法答案 0 :(得分:1)
我跑了好几次,如果你这样做,你会注意到它会在第一次出现差异.7但是如果你不清楚并再次运行它,那么方差就会出现1 ...
这是因为您要将0
留在X
向量中。现在写成,如果您的候选人i
被拒绝,那么您将X(i)
留给0
并转到i+1
,您不应该这样做,你需要生成样本,直到一个被接受为X(i)
,因此您可以通过忘记no_of_loops
并在X
中将新样本写为:
X(acceptances) = Y;
这样你就不会留下空白(因此0)
会减少差异。