关于随机值

时间:2010-12-10 06:50:12

标签: java algorithm random

  

可能重复:
  Getting N random numbers that the sum is M

您好 我有一个问题:

如何获得随机值,其中所有值的总和为1。 例如{0.5,0.5}{0.25,0.25,0.5}等。 这些值的数量每次都不同,一次可以是2,一次可以是3,就像上面的例子一样! 感谢。

5 个答案:

答案 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)