获得N个随机数,其总和为M获得N个随机数,其总和为M(Getting N random number

2019-05-10 09:49发布

我想获得N个随机数,其和值。

例如,假设我想5张随机数的总和为1。

然后,一个有效的可能性是:

0.2 0.2 0.2 0.2 0.2

另一种可能性是:

0.8 0.1 0.03 0.03 0.04

等等。 我需要这个创造物品的模糊C均值的矩阵。

Answer 1:

答案很简单:

刚产生N个随机数,计算它们的总和,将每个由一个总和与由M.乘

更长的答案:

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

生成0和1之间N-1的随机数,添加的数字0和1本身到列表中,对它们进行排序,并采取相邻数字的差异。

我不知道如果这产生一个均匀分布



Answer 2:

生成0和1之间N-1的随机数,添加的数字0和1本身到列表中,对它们进行排序,并采取相邻数字的差异。



Answer 3:

我认为这是值得一提的是目前公认的答案没有给出一个均匀分布:

“就产生N个随机数,计算它们的总和,除以每一个由总和”

看到这,让我们看看情况下,N = 2和M = 1。 这是一个简单的情况下,由于我们可以生成一个列表[x,1-X],通过均匀地在范围(0,1)选择X。 所提出的方案产生一对[X /(X + Y)中,y /(X + Y)],其中x和y是在(0,1)是均匀的。 为了分析这一点,我们选择一些ž使得0 <Z <0.5,并且计算所述第一元件是小于Z的概率。 这probaility应该是Z如果分布均匀。 然而,我们得到

概率(X /(X + Y)<Z)=概率(X <Z(X + Y))=概率(×(1-Z)<ZY)=概率(X <Y(Z /(1-z)的))= Z /(2-2z)。

我做了一些快速计算,看来,迄今为止唯一的解决方案,appers导致被均匀分布提出马蒂Virkkunen :

“生成0和1之间N-1的随机数,添加的数字0和1本身到列表中,对它们进行排序,并采取相邻数字的差别”。



Answer 4:

在Java:

private static double[] randSum(int n, double m) {
    Random rand = new Random();
    double randNums[] = new double[n], sum = 0;

    for (int i = 0; i < randNums.length; i++) {
        randNums[i] = rand.nextDouble();
        sum += randNums[i];
    }

    for (int i = 0; i < randNums.length; i++) {
        randNums[i] /= sum * m;
    }

    return randNums;
}


Answer 5:

此问题是等效于具有产生随机数的问题狄利克雷分布 。 以生成N正数即总和为正数M,其中每个可能的组合是等可能的:

  • 生成N个指数分布的随机数。 产生这种数量的一种方式可以写成原样

     number = -ln(1.0 - RNDU()) 

    其中ln(x)是的自然对数xRNDU()是返回的随机数大于或等于0且小于1的方法(例如,JavaScript的Math.random() 需要注意的是具有均匀分布的产生这些数字是不理想的,因为会导致随机数组合的偏压分布。

  • 分割产生这样通过它们的总和的数字。
  • 乘以M.每个号码

其结果是在一个狄利克雷分布其总和近似等于M×N个数字(我说“大致”,是因为舍入误差的)。

此问题也相当于问题从一个N维单形均匀地生成随机数 。



Answer 6:

刚才生成的N个随机数,计算它们的总和,除以每一个由总和。

扩展在Guillaume的接受的答案 ,这里是一个Java函数正是这么做的。

public static double[] getRandDistArray(int n, double m)
{
    double randArray[] = new double[n];
    double sum = 0;

    // Generate n random numbers
    for (int i = 0; i < randArray.length; i++)
    {
        randArray[i] = Math.random();
        sum += randArray[i];
    }

    // Normalize sum to m
    for (int i = 0; i < randArray.length; i++)
    {
        randArray[i] /= sum;
        randArray[i] *= m;
    }
    return randArray;
}

在试运行, getRandDistArray(5, 1.0)返回以下:

[0.38106150346121903, 0.18099632814238079, 0.17275044310377025, 0.01732932296660358, 0.24786240232602647]


Answer 7:

  1. 生成N-1个随机数。
  2. 计算表示数字的总和。
  3. 添加所计算的总和和所期望的总和与设定之间的差。

你现在有N个随机数,并且它们的和所期望的总和。



Answer 8:

不幸的是,一些在这里的答案是不正确的,如果你想均匀随机数。 ,保证均匀随机数最简单的(和在许多语言最快)解决方案只是

# This is Python, but most languages support the Dirichlet.
import numpy as np
np.random.dirichlet(np.ones(n))*m

其中n是随机数的数目要生成和m是所得阵列的总和。 这种方法产生正的值,是用于生成有效概率那笔为1(令m = 1)是特别有用的。



Answer 9:

你的约束有点渺茫。 程序很多很多会工作。

例如,被数正态分布? 制服?
I'l假定所有的数字必须为正和周围的平均值,M / N均匀分布。

试试这个。

  1. 平均= M / N。
  2. 生成0至2 *意味着N-1的值。 这可以是0和1,U之间的标准号,以及随机值是(2 * U-1)*意思是创建在适当范围内的值。
  3. 计算N-1的值的总和。
  4. 剩余的值是N-总和。
  5. 如果剩余的值不符合约束条件(0〜2 *平均值)重复上述步骤。


文章来源: Getting N random numbers whose sum is M