Random 求和为M的N个随机数
我想得到N个随机数,其和是一个值 例如,假设我想要5个随机数,其和为1 那么,一种有效的可能性是: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 更长的回答: 上述解决方案不会产生均匀分布,这可能是一个问题,取决于这些随机数的用
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周围 试试这个
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,使得0publicstaticdouble[]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
是一种返回统一随机数0或更大且小于1的方法(例如,JavaScript的RNDU()
)。请注意,生成具有均匀分布的N个数并不理想,因为将导致随机数组合的有偏分布Math.random()
- 用这种方法生成的数字除以它们的和
- 将每个数字乘以M
<>但是,为了更好的精度(与在实践中经常出现的浮点数的选择相比),你应该考虑生成,并将这些整数作为分子来处理:<代码> n < /代码>有理数,用分母“代码> x< /代码>(并将其总和为<代码> M< /代码>假设代码>M< /Case>是整数). 您可以选择
x
作为一个大数字,如232或264,或具有所需精度的其他数字
下面的伪代码显示了如何以随机顺序生成大于0且具有给定正和的n
均匀随机整数。(该算法在Smith和Tromble的《从单位单纯形均匀采样》(2004年)中给出),在下面的伪代码中-
- 方法
以随机顺序返回大于0的PositiveIntegersWithSum
整数,其总和为n
m
- 方法
整数与su