Random 求和为M的N个随机数

Random 求和为M的N个随机数,random,language-agnostic,sum,Random,Language Agnostic,Sum,我想得到N个随机数,其和是一个值 例如,假设我想要5个随机数,其和为1 那么,一种有效的可能性是: 0.2 0.2 0.2 0.2 0.2 0.8 0.1 0.03 0.03 0.04 另一种可能性是: 0.2 0.2 0.2 0.2 0.2 0.8 0.1 0.03 0.03 0.04 等等。我需要这个来创建模糊C-均值的归属矩阵。简短回答: 只需生成N个随机数,计算它们的和,将每个数除以 求和并乘以M 更长的回答: 上述解决方案不会产生均匀分布,这可能是一个问题,取决于这些随机数的用

我想得到N个随机数,其和是一个值

例如,假设我想要5个随机数,其和为1

那么,一种有效的可能性是:

0.2 0.2 0.2 0.2 0.2
0.8 0.1 0.03 0.03 0.04
另一种可能性是:

0.2 0.2 0.2 0.2 0.2
0.8 0.1 0.03 0.03 0.04

等等。我需要这个来创建模糊C-均值的归属矩阵。

简短回答:

只需生成N个随机数,计算它们的和,将每个数除以 求和并乘以M

更长的回答:

上述解决方案不会产生均匀分布,这可能是一个问题,取决于这些随机数的用途。 Matti Virkkunen提出的另一种方法:


生成0和1之间的N-1个随机数,将数字0和1相加 将他们自己添加到列表中,对它们进行排序,并找出它们之间的差异 相邻号码


这将产生一个统一的分布,正如所解释的那样,生成0和1之间的N-1个随机数,将数字0和1本身添加到列表中,对它们进行排序,并计算相邻数字的差异。

您的约束条件有点有限。很多很多程序都会奏效

例如,数字是否正态分布?制服?
我假设所有的数字都是正的,并且均匀分布在平均数M/N周围

试试这个

  • 平均值=M/N
  • 生成介于0和2*平均值之间的N-1值。这可以是介于0和1,u之间的标准数字,随机值为(2*u-1)*表示在适当范围内创建值
  • 计算N-1个值的总和
  • 剩余值为N-sum
  • 如果剩余值不符合约束条件(0到2*平均值),请重复该过程
  • 生成N-1个随机数
  • 计算上述数字之和
  • 将计算和与所需和之间的差值添加到集合中
  • 您现在有N个随机数,它们的和就是所需的和。

    在Java中:

    private static double[]随机数和(int n,double m){
    Random rand=新的Random();
    双随机数[]=新的双随机数[n],和=0;
    对于(int i=0;i
    我认为值得注意的是,没有给出统一的分布:

    “只要生成N个随机数, 计算它们的总和,将每一个除以 “总数”

    为了了解这一点,让我们看看N=2和M=1的情况。这是一个简单的例子,因为我们可以通过在范围(0,1)内均匀地选择x来生成一个列表[x,1-x]。 建议的解决方案生成一对[x/(x+y),y/(x+y)],其中x和y在(0,1)中是一致的。为了分析这一点,我们选择一些z,使得0 Prob(x/(x+y) 我做了一些快速计算,似乎到目前为止,唯一能导致均匀分布的解决方案是:

    生成0和1之间的N-1个随机数,将数字0和1本身添加到列表中,对它们进行排序,并计算相邻数字的差值

    只需生成N个随机数,计算它们的和,将每个数除以 总数

    ,这里有一个Java函数,它正是这样做的

    publicstaticdouble[]getRandDistArray(int n,double m)
    {
    双随机数组[]=新的双随机数组[n];
    双和=0;
    //生成n个随机数
    对于(int i=0;i
    在测试运行中,
    GetRandDistary(5,1.0)
    返回以下内容:

    [0.38106150346121903, 0.18099632814238079, 0.17275044310377025, 0.01732932296660358, 0.24786240232602647]
    

    生成N个正数,其总和为正数M,其中每个可能的组合的可能性相等:

    • 生成N个指数分布的随机数。生成此类数字的一种方法可以写为-

        number = -ln(1.0 - RNDU())
      
      其中,
      ln(x)
      x
      的自然对数,
      RNDU()
      是一种返回统一随机数0或更大且小于1的方法(例如,JavaScript的
      Math.random()
      )。请注意,生成具有均匀分布的N个数并不理想,因为将导致随机数组合的有偏分布

    • 用这种方法生成的数字除以它们的和

    • 将每个数字乘以M

    结果是N个数字,其和大约等于M(由于舍入误差,我说“近似”)。另见维基百科文章

    这个问题也相当于一个问题


    <>但是,为了更好的精度(与在实践中经常出现的浮点数的选择相比),你应该考虑生成,并将这些整数作为分子来处理:<代码> n < /代码>有理数,用分母“代码> x< /代码>(并将其总和为<代码> M< /代码>假设代码>M< /Case>是整数). 您可以选择
    x
    作为一个大数字,如232或264,或具有所需精度的其他数字

    下面的伪代码显示了如何以随机顺序生成大于0且具有给定正和的
    n
    均匀随机整数。(该算法在Smith和Tromble的《从单位单纯形均匀采样》(2004年)中给出),在下面的伪代码中-

    • 方法
      PositiveIntegersWithSum
      以随机顺序返回大于0的
      n
      整数,其总和为
      m
    • 方法
      整数与su