您好 我有一个问题:
如何获得随机值,其中所有值的总和为1
。
例如{0.5,0.5}
或{0.25,0.25,0.5}
等。
这些值的数量每次都不同,一次可以是2
,一次可以是3
,就像上面的例子一样!
感谢。
答案 0 :(得分:12)
我将为您概述基本算法:
决定您将生成多少个将被求和的随机数。
生成那么多随机数。
决定他们应该加起来什么。
将上一步的数字除以随机数的总和。
将每个随机数除以上一步中的数字。
基本上你要做的就是生成一堆无界的随机数,然后将它们全部调整,以便它们加起来一些特定的数字。
顺便说一句:如果您生成的所有随机数都为零,那么您使用此算法就会产生除零误差。因此,您应该在实现中陷阱,并在循环中重试随机数生成,直到获得非零的随机数总和。
答案 1 :(得分:1)
通常,您可以生成随机大小的数组:
java.util.Random rand = new java.util.Random();
final int MAX_SIZE = 100;
double[] a = new double[1 + rand.nextInt(MAX_SIZE)];
(这里我假设您不希望数组大于100个元素。)
然后用随机正数填充数组:
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;
}
答案 2 :(得分:0)
嗯,我认为最简单的方法就是这样:
生成两个数字:
r1 = new RandomNumber
r2 = 1 - r1
生成三个数字:
r1 = new RandomNumber
r2 = r1 / 2
r3 = 1 - r1
r1 = r1 / 2
我不知道是否有更简单的方法可以做到这一点,上面的代码只是伪代码。
答案 3 :(得分:0)
喜欢@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;
}
答案 4 :(得分:0)
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)