norminv和normrnd之间有什么联系?

时间:2014-01-23 21:35:00

标签: matlab

如果我只是想计算一个标准的正常变量,那么使用之间有什么区别:

samples=norminv(rand(N),0,1);

samples=normrnd(0,1,N,1);

在蒙特卡罗模拟中使用时的处理时间或收敛性?

我问的原因是我想使用像norminv()的Halton数字这样的准蒙特卡罗技术来复制normrnd(),但首先我要确保理解它们之间的关系。 / p>

我想其中一个核心问题是:如何分别在rand()normrnd中生成随机数?它是一样的方法吗?

如果它们完全等同于复制的原因?

2 个答案:

答案 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(...))更有效。

为什么randnormrnd更快?因为normrnd仅在rand之前进行了一些输入检查,并且如@chappjc's answer中所述,您还可以指定均值和标准差(但您似乎并不需要这样做)。 (您可以通过键入normrnd)来查看open normrnd源代码。

底线:我会使用randn

答案 1 :(得分:2)

您获得带有rand统一分发,以及带有randn普通分发。

现在,如果问题是normrndrandn之间的关系是什么,答案是normrnd是一个便利函数,它将分布的均值和标准差视为输入参数。也就是说,normrnd执行以下操作:

r = randn(sizeOut) .* sigma + mu;

关于normrnd(使用randn)与norminv(使用rand),请参阅Luis Mendo的答案(它将是相同的分布)。正如我所指出的,您可以完全使用上面的等式跳过normrnd