使用matlab条件生成随机数

时间:2012-04-06 19:48:22

标签: matlab random

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

             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 如何在不进入概率和复杂性的情况下得到类似的东西统计

1 个答案:

答案 0 :(得分:2)

你可以比实际生成所有这些矩阵更直接地做到这一点,并且通过考虑最终输出的分布来实现这一点非常容易。

由N(0,.2)分布的随机变量在.2和.3之间的概率为p~ = .092。

调用矩阵X的最终输出的随机变量,这样做n(20)次。然后(a)X位于.2和.3之间并且你提前停止,或者(b)你没有在第一次n-1平局中在.2和.3之间绘制一个数字,所以你去了你得到的任何东西在第n次抽签。

(b)发生的概率只是b =(1-p)^(n-1):在[.2,.3]之外绘制的具有概率1-p的独立事件发生在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矩阵进行100,000次的经验性CDF图。 (也就是说,我将两个函数运行了100k次并保存了结果,然后使用cdfplot绘制x轴上的值与获得的值中小于y轴上的值的部分。)

他们是完全相同的。 (实际上,K-S test对于分布的同一性给出了0.71的p值。)但直接的方式是更快的运行。