【问题标题】:Generate a random number with max, min and mean (average) in Matlab在 Matlab 中生成具有最大值、最小值和平均值(平均值)的随机数
【发布时间】:2012-03-23 11:59:51
【问题描述】:

我需要生成具有以下属性的随机数。

  • 最小值必须为 1
  • 最大值必须为 9
  • 平均值(平均值)为 6.00(或其他值)
  • 随机数只能是整数(正数)

我尝试了几种语法,但没有任何效果,例如

r=1+8.*rand(100,1);

这给了我一个 1-9 之间的随机数,但它不是整数(例如 5.607 或 4.391),并且每次我计算平均值时它都会变化。

【问题讨论】:

  • 你想要什么样的分布形式?
  • 对于任何 RNG,不要期望平均值总是与您指定的完全一样,它会因运行而异。 N越大,它可能越接近。
  • 分布类型并不重要,只希望每组随机数的均值相同。

标签: matlab random


【解决方案1】:

您或许可以根据 Matlab 的randi 函数定义满足您要求的函数。但要小心,很容易定义不产生随机数的随机数生成器的函数。

另一种方法可能适合 - 创建一个概率分布来满足您的要求。在这种情况下,您需要一个由 9 个浮点数组成的向量,它们总和为 1,并且分别表示第 i 个整数出现的概率。例如,分布可能由以下向量描述:

[0.1 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1]

这些将区间 [0,1] 分成 9 个部分。然后,取你最喜欢的 rng,它生成 [0,1) 范围内的浮点数并生成一个数字,假设它是 0.45。顺着 0 到 1 的区间读取,发现在第 5 个区间,所以返回整数 5。

显然,我懒得给你一个向量,它给出了 6 作为分布的平均值,但这对你来说应该不难弄清楚。

【讨论】:

    【解决方案2】:

    这是一个带有循环的算法,通过根据当前迭代的平均值将随机数从向量的一半重新生成到另一个向量,从而达到所需的平均值 xmean(具有所需的精度 xeps)。通过我的测试,它很快就达到了平均值。

    n = 100;
    xmean = 6;
    xmin = 1;
    xmax = 9;
    xeps = 0.01;
    x = randi([xmin xmax],n,1);
    while abs(xmean - mean(x)) >= xeps
        if xmean > mean(x)
            x(find(x < xmean,1)) = randi([xmean xmax]);
        elseif xmean < mean(x)
            x(find(x > xmean,1)) = randi([xmin xmean]);
        end
    end
    

    x 是您需要的输出。

    【讨论】:

    • 这个语法给我 --- ??? 'double'类型的输入参数的未定义函数或方法'randi'。----请T-T帮助我。
    • 函数randi(生成随机整数)首先出现在 MATLAB 2008b 版本中。可能你的年龄更大。看到这个SO answer
    • 你给我的算法在 MATLAB2010b 上运行良好,非常感谢你 ^^ 但有时平均值不是整数,例如 6.65 或 4.77 然后这个算法拒绝为我生成数字 T-T 如何我可以使用不是整数的意思吗?
    • 你从来没有说过平均值必须是你需要的整数。请解释。什么是 T-T?
    • 很抱歉没有告诉你清楚^^" 再次感谢你,yuk。你的算法只是暂时救了我的命。我不得不说我是 MATLAB 或这样的统计新手,我以前从未这样做过,但仍然尝试学习。所以,可以将均值设置为非整数值吗?这组随机数我将用来证明像这样用我蹩脚的英语很难解释的东西^^”以防万一,有时意思不是整数值,这个算法无法生成^^所以,有可能吗?
    【解决方案3】:

    您可以使用randi 获取随机整数

    【讨论】:

      【解决方案4】:

      您可以使用 floor 将随机数截断为仅整数值:

      r = 1 + floor(9 * rand(100,1));
      

      获得指定的平均值有点棘手;这取决于你追求什么样的分布。

      【讨论】:

      • 任何类型的分发都可以,只是每次生成都一样。
      【解决方案5】:

      如果分布并不重要并且您只关心平均值,那么有一个特别简单的函数可以做到这一点:

      function x=myrand
       x=6;
      end
      

      【讨论】:

      • 这根本不会生成随机数...它会生成概率为 1 的6
      【解决方案6】:

      在您设计随机数生成器之前,您需要指定它应该从中提取的分布。您只是部分地做到了这一点:即,您指定它从 [1,9] 中的整数中提取,并且它具有您希望能够指定的平均值。这仍然留下了无限的分布可供选择。您希望您的发行版具有哪些其他属性?

      编辑以下评论:概率分布中任何有限样本的平均值——所谓的样本平均值——只会接近分布的平均值。没有办法解决这个问题。

      如上所述,在域 [1,9] 中的整数上的最简单(在最大熵意义上)分布是指数分布:即,

      p = @(n,x)(exp(-x*n)./sum(exp(-x*(1:9))));
      

      参数x 确定分布均值。对应的累积分布为

      c = cumsum(p(1:9,x));
      

      要从分布p 中抽取,您可以从 [0,1] 中抽取一个随机数,然后找出它位于 c 的哪个子区间:即

      samp = arrayfun(@(y)find(y<c,1),rand(n,m));
      

      将返回一个从p 提取的整数数组[n,m]

      【讨论】:

      • 任何类型的分布都可以,分布类型并不重要,只希望每组随机数的均值相同。谢谢。
      猜你喜欢
      • 2016-06-27
      • 2018-07-01
      • 2017-09-07
      • 2013-04-01
      • 2016-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      相关资源
      最近更新 更多