我想获得N个随机数,其和值。
例如,假设我想5张随机数的总和为1。
然后,一个有效的可能性是:
0.2 0.2 0.2 0.2 0.2
另一种可能性是:
0.8 0.1 0.03 0.03 0.04
等等。 我需要这个创造物品的模糊C均值的矩阵。
我想获得N个随机数,其和值。
例如,假设我想5张随机数的总和为1。
然后,一个有效的可能性是:
0.2 0.2 0.2 0.2 0.2
另一种可能性是:
0.8 0.1 0.03 0.03 0.04
等等。 我需要这个创造物品的模糊C均值的矩阵。
答案很简单:
刚产生N个随机数,计算它们的总和,将每个由一个总和与由M.乘
更长的答案:
上述解决方案不会产生均匀分布取决于什么是用于这些随机数字,这可能是一个问题。 由马蒂Virkkunen提出的另一种方法:
生成0和1之间N-1的随机数,添加的数字0和1本身到列表中,对它们进行排序,并采取相邻数字的差异。
我不知道如果这产生一个均匀分布
生成0和1之间N-1的随机数,添加的数字0和1本身到列表中,对它们进行排序,并采取相邻数字的差异。
我认为这是值得一提的是目前公认的答案没有给出一个均匀分布:
“就产生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本身到列表中,对它们进行排序,并采取相邻数字的差别”。
在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;
}
此问题是等效于具有产生随机数的问题狄利克雷分布 。 以生成N正数即总和为正数M,其中每个可能的组合是等可能的:
生成N个指数分布的随机数。 产生这种数量的一种方式可以写成原样
number = -ln(1.0 - RNDU())
其中ln(x)
是的自然对数x
和RNDU()
是返回的随机数大于或等于0且小于1的方法(例如,JavaScript的Math.random()
需要注意的是具有均匀分布的产生这些数字是不理想的,因为会导致随机数组合的偏压分布。
其结果是在一个狄利克雷分布其总和近似等于M×N个数字(我说“大致”,是因为舍入误差的)。
此问题也相当于问题从一个N维单形均匀地生成随机数 。
刚才生成的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]
你现在有N个随机数,并且它们的和所期望的总和。
不幸的是,一些在这里的答案是不正确的,如果你想均匀随机数。 ,保证均匀随机数最简单的(和在许多语言最快)解决方案只是
# 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)是特别有用的。
你的约束有点渺茫。 程序很多很多会工作。
例如,被数正态分布? 制服?
I'l假定所有的数字必须为正和周围的平均值,M / N均匀分布。
试试这个。