【问题标题】:conditional generation of random numbers using matlab使用matlab条件生成随机数
【发布时间】:2012-04-20 08:49:33
【问题描述】:

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

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

round1 的输出是: 答案 =

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

第 2 轮的输出是: 答案 =

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

第 3 轮的输出是: 答案 =

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 进行更改。

我找到了 rng(sd),它使用非负整数 sd 为随机数生成器提供种子,以便 rand、randi 和 randn 产生可预测的数字序列。

How to set custom seed for pseudo-random number generator

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

另一个问题:似乎 rng 不适用于 matlab r2009 如何在不涉及概率和统计的复杂性的情况下获得类似的东西

【问题讨论】:

    标签: matlab random


    【解决方案1】:

    与实际生成所有这些矩阵相比,您可以更直接地执行此操作,而且通过考虑最终输出的分布,这很容易做到。

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

    调用矩阵 X 的最终输出的随机变量,在其中执行 n (20) 次。然后要么(a)X 位于 0.2 和 0.3 之间,而你提前停止,要么(b)你在前 n-1 次抽签中没有抽到 0.2 和 0.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 给出的 p 值为 0.71。)但直接的方法是运行得更快。

    【讨论】:

    • 代码以以下错误结尾@Dougal: ???矩形空矩阵分配不当。
    • @pac 我刚刚运行了更直接的方法,它运行良好(尽管我修复了一些小错误)。这对你来说会更快更好,所以我从我的答案中删除了另一种方式。请注意,这些参数的概率b 是 0.16,因此 84% 的矩阵将“提前停止”。
    • @pac 我重新添加了直接执行此操作的代码的工作版本。我仍然认为实际上投入 30 秒的思考是更好的方法,但无论如何。另外,我看不出rng 与这个问题有什么关系:您是想让结果可重现,还是希望以某种方式使用它来为您生成?
    • 我正在考虑使用 rng 来复制先前的结果以获取 0.2 和 0.3 之间的值。然后使用循环使用 rnd 来获取其他结果。
    • @pac 是的,没有理由调整随机数种子来重新生成它。此外,您必须分解生成而不是一次生成完整的矩阵。
    猜你喜欢
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2014-10-30
    • 2019-04-25
    相关资源
    最近更新 更多