可能是重复问题:
获取N个随机数,使它们的和为M
你好, 我有一个问题:
如何获得随机值,使它们的总和为1
。
例如:{0.5,0.5}
或{0.25,0.25,0.5}
等等。
这些值的数量每次都不同,有时可以是2
,有时可以是3
,就像上面的例子一样!
谢谢。
可能是重复问题:
获取N个随机数,使它们的和为M
你好, 我有一个问题:
如何获得随机值,使它们的总和为1
。
例如:{0.5,0.5}
或{0.25,0.25,0.5}
等等。
这些值的数量每次都不同,有时可以是2
,有时可以是3
,就像上面的例子一样!
谢谢。
决定要生成多少个随机数来求和。
生成上述数量的随机数。
确定它们应该相加得到什么数字。
将前一步中的数字除以随机数之和。
将每个随机数除以前一步中的数字。
java.util.Random rand = new java.util.Random();
final int MAX_SIZE = 100;
double[] a = new double[1 + rand.nextInt(MAX_SIZE)];
for (int i = 0; i < a.length; ++ i)
{
a[i] = rand.nextDouble();
}
然后您需要对数组进行归一化(将每个元素除以总和)。 首先,我们计算总和:
double sum = 0.0;
for (int i = 0; i < a.length; ++ i)
{
sum += a[i];
}
for (int i = 0; i < a.length; ++ i)
{
a[i] /= sum;
}
java.util.Random rand = new java.util.Random();
final int MAX_SIZE = 100;
double[] a = new double[1 + rand.nextInt(MAX_SIZE)];
double sum = 0.0;
for (int i = 0; i < a.length; ++ i)
{
a[i] = rand.nextDouble();
sum += a[i];
}
for (int i = 0; i < a.length; ++ i)
{
a[i] /= sum;
}
类似@dsg但更短。它允许您指定总和应该是多少。
public static double[] randomDoubles(int size, double sum) {
double total=0, doubles[]=new double[size];
for(int i=0;i<size;i++) total += doubles[i] = Math.random();
for(int i=0;i<size;i++) doubles[i] *= sum/total;
return doubles;
}
对于 n 个随机数怎么样:
r1 = random(0,1)
r2 = random(0, 1-r1)
r3 = random(0, 1-r1-r2)
...
r(n) = 1 - r1-r2-f3...-r(n-1)
嗯,我认为最简单的方法是这样的:
生成两个数字:
r1 = new RandomNumber
r2 = 1 - r1
生成三个数字:
r1 = new RandomNumber
r2 = r1 / 2
r3 = 1 - r1
r1 = r1 / 2
我不知道是否有更简单的方法来完成这个任务,上面的代码只是伪代码。