2012-04-06 105 views
0

我有一个函数,使用normrnd生成正态分布的正态随机数矩阵。使用matlab条件生成随机数

   values(vvvv)= normrnd(0,0.2); 

的输出是从ROUND1是: ANS =

0.0210 0.1445 0.5171 -0.1334 0.0375 -0.0165  Inf -0.3866 -0.0878 -0.3589 

从2轮的输出是: ANS =

0.0667 0.0783 0.0903 -0.0261 0.0367 -0.0952 0.1724 -0.2723  Inf  Inf 

输出从3轮是: ANS =

0.4047 -0.4517 0.4459 0.0675 0.2000 -0.3328 -0.1180 -0.0556 0.0845  Inf 

该功能将被重复20次。

很明显,该功能是完全随机的。我所追求的是添加一个条件。

我需要的是:如果任何条目的值介于0.2和0.3之间。该价值将在下一轮固定。只有剩余的条目才会使用函数rand进行更改。

我发现使用非负整数sd给随机数发生器种子的rng(sd),以便rand,randi和randn产生一个可预测的数字序列。

How to set custom seed for pseudo-random number generator

但如何使矩阵的几个条目只影响!

另一个问题:似乎RNG不适用于MATLAB R2009 如何获得类似的东西没有超过直接输入概率的并发症&统计

回答

2

你可以做到这实际上产生所有这些矩阵,它的通过考虑最终输出的分布,很容易做到这一点。

由N(0,.2)分布的随机变量位于0.2和0.3之间的概率为p〜= .092。

调用矩阵X的最终输出的随机变量,在此处执行n(20)次。然后(a)X位于0.2和0.3之间,并且你提前停止,或者(b)在第一次n-1抽签中你没有在.2和.3之间画出一个数字,所以你用任何你得到的在第n场比赛中。 (b)发生的概率只是b =(1-p)^(n-1):在概率为1-p时出现的[.2,.3]外部的独立事件发生n -1倍。因此(a)的概率是1-b。

如果(b)发生,您只需从normrnd中抽出一个数字。如果(a)发生,你需要一个正常变量的值,条件是它在.2和.3之间。一种方法是找到.2和.3的cdf值,从那里的范围内统一绘制,然后使用反向cdf来找回原始数字。

做这个代码:

mu = 0; 
sigma = .2; 
upper = .3; 
lower = .2; 
n = 20; 
sz = 15; 

cdf_upper = normcdf(upper, mu, sigma); 
cdf_lower = normcdf(lower, mu, sigma); 
p = cdf_upper - cdf_lower; 
b = (1-p)^(n - 1); 

results = zeros(sz, sz); 
mask = rand(sz, sz) > b; % mask value 1 means case (a), 0 means case (b) 
num_a = sum(mask(:)); 

cdf_vals = rand(num_a, 1) * p + cdf_lower; 
results(mask) = norminv(cdf_vals, mu, sigma); 

results(~mask) = normrnd(mu, sigma, sz^2 - num_a, 1); 

如果要模拟这种直接出于某种原因(这是会涉及到很多无用功,但显然你不喜欢的”统计学的复杂性“ - 顺便说一下,这是概率,而不是统计学),您可以生成第一个矩阵,然后仅替换不在所需范围内的元素。例如:

mu = 0; 
sigma = .2; 
n = 10; 
m = 10; 
num_runs = 20; 
lower = .2; 
upper = .3; 

result = normrnd(mu, sigma, n, m); 
for i = 1 : (num_runs - 1) 
    to_replace = (result < lower) | (result > upper); 
    result(to_replace) = normrnd(mu, sigma, sum(to_replace(:)), 1); 
end 

为了证明这些是相同的,这里是做这行的1x1的经验的CDF的曲线矩阵10万次。 (即,我跑两种功能100k的时间和保存的结果,然后使用cdfplot到在x轴上VS是小于在y轴上所获得的值的部分绘制的值。)

它们是相同的。 (事实上​​,分配身份的K-S test给出的p值为0.71)。但直接的方式是运行速度更快。

+0

代码以下列错误结束@Dougal:???长方形空矩阵分配不当。 – pac 2012-04-07 09:35:03

+0

@pac我只是运行更直接的方法,它工作正常(虽然我修复了一些小错误)。这样做会更快,更好,所以我从我的答案中删除了另一种方式。请注意,这些参数的概率为b,因此矩阵的84%将会“提早停止”。 – Dougal 2012-04-07 17:19:06

+0

@pac我重新添加了直接执行它的代码的工作版本。我仍然认为实际上把30秒的想法放在里面是更好的方法,但无论如何。另外,我不明白'rng'与这个问题有什么关系:你是想让结果重现,还是你希望以某种方式使用它来为你生成一代? – Dougal 2012-04-07 18:28:44