如果我只是想计算一个标准的正常变量,那么使用之间有什么区别:
samples=norminv(rand(N),0,1);
和
samples=normrnd(0,1,N,1);
在蒙特卡罗模拟中使用时的处理时间或收敛性?
我问的原因是我想使用像norminv()
的Halton数字这样的准蒙特卡罗技术来复制normrnd()
,但首先我要确保理解它们之间的关系。 / p>
我想其中一个核心问题是:如何分别在rand()
和normrnd
中生成随机数?它是一样的方法吗?
如果它们完全等同于复制的原因?
答案 0 :(得分:3)
这两种方法都由theorem of inverse transformation给出相同的分布(你肯定知道的)。但是,一个重要的区别是计算时间:
N = 1e6;
tic
samples = norminv(rand(N,1),0,1);
toc
tic
samples = normrnd(0,1,N,1);
toc
tic
samples = randn(N,1);
toc
给出
Elapsed time is 0.171892 seconds.
Elapsed time is 0.039265 seconds.
Elapsed time is 0.029649 seconds.
因此,即使Matlab可能在内部使用均匀随机数来生成高斯随机数,其实现在速度方面比自己norminv(rand(...))
更有效。
为什么rand
比normrnd
更快?因为normrnd
仅在rand
之前进行了一些输入检查,并且如@chappjc's answer中所述,您还可以指定均值和标准差(但您似乎并不需要这样做)。 (您可以通过键入normrnd
)来查看open normrnd
源代码。
底线:我会使用randn
。
答案 1 :(得分:2)
您获得带有rand
的统一分发,以及带有randn
的普通分发。
现在,如果问题是normrnd
和randn
之间的关系是什么,答案是normrnd
是一个便利函数,它将分布的均值和标准差视为输入参数。也就是说,normrnd
执行以下操作:
r = randn(sizeOut) .* sigma + mu;
关于normrnd
(使用randn
)与norminv
(使用rand
),请参阅Luis Mendo的答案(它将是相同的分布)。正如我所指出的,您可以完全使用上面的等式跳过normrnd
。