通过A-R算法生成标准正态随机变量的问题

时间:2015-02-13 13:04:39

标签: matlab

这是一个非常具体的问题,但我使用验收拒绝算法尝试从两个镜像指数生成标准正态随机变量。代码如下:

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页相同的想法

1 个答案:

答案 0 :(得分:1)

我跑了好几次,如果你这样做,你会注意到它会在第一次出现差异.7但是如果你不清楚并再次运行它,那么方差就会出现1 ... 这是因为您要将0留在X向量中。现在写成,如果您的候选人i被拒绝,那么您将X(i)留给0并转到i+1,您不应该这样做,你需要生成样本,直到一个被接受为X(i),因此您可以通过忘记no_of_loops并在X中将新样本写为:

来轻松修复代码
X(acceptances) = Y;

这样你就不会留下空白(因此0)会减少差异。