Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于随机值_Java_Algorithm_Random - Fatal编程技术网

Java 关于随机值

Java 关于随机值,java,algorithm,random,Java,Algorithm,Random,可能重复: 嗨 我有一个问题: 如何获得所有值之和为1的随机值。 如{0.5,0.5}或{0.25,0.25,0.5}等。 此外,这些值的数量每次都不同,一次可以是2,一次可以是3,如上面的示例所示! 谢谢。我将为您概述基本算法: 决定将生成多少个随机数进行求和 生成那么多随机数 决定他们应该加起来什么 将上一步的数字除以随机数之和 将每个随机数除以上一步的数字 基本上,你要做的是生成一组无界随机数,然后调整它们,使它们加起来成为某个特定的数 顺便说一句:如果你生成的所有随机数都是零,那么

可能重复:

嗨 我有一个问题:

如何获得所有值之和为
1
的随机值。 如
{0.5,0.5}
{0.25,0.25,0.5}
等。 此外,这些值的数量每次都不同,一次可以是
2
,一次可以是
3
,如上面的示例所示!
谢谢。

我将为您概述基本算法:

  • 决定将生成多少个随机数进行求和

  • 生成那么多随机数

  • 决定他们应该加起来什么

  • 将上一步的数字除以随机数之和

  • 将每个随机数除以上一步的数字

基本上,你要做的是生成一组无界随机数,然后调整它们,使它们加起来成为某个特定的数


顺便说一句:如果你生成的所有随机数都是零,那么这个算法会有一个被零除的错误。因此,您应该在实现中对此设置陷阱,并在循环中重试随机数生成,直到获得随机数的非零和。

我认为最简单的方法是这样:

要生成两个数字:

r1 = new RandomNumber
r2 = 1 - r1
要生成三个数字:

r1 = new RandomNumber
r2 = r1 / 2
r3 = 1 - r1
r1 = r1 / 2
    for (int i = 0; i < a.length; ++ i)
    {
        a[i] = rand.nextDouble();
    }

我不知道是否有更简单的方法来实现这一点,上面的代码只是伪代码。

通常,您可以生成一个随机大小的数组:

    java.util.Random rand = new java.util.Random();
    final int MAX_SIZE = 100;
    double[] a = new double[1 + rand.nextInt(MAX_SIZE)];
(这里我假设您不希望数组大于100个元素。)

然后用随机正数填充数组:

r1 = new RandomNumber
r2 = r1 / 2
r3 = 1 - r1
r1 = r1 / 2
    for (int i = 0; i < a.length; ++ i)
    {
        a[i] = rand.nextDouble();
    }
for(int i=0;i
然后规范化数组(将每个元素除以总和)。 首先,我们计算总和:

    double sum = 0.0;
    for (int i = 0; i < a.length; ++ i)
    {
        sum += a[i];
    }
double sum=0.0;
对于(int i=0;i
然后将每个数组元素除以总和:

    for (int i = 0; i < a.length; ++ i)
    {
        a[i] /= sum; 
    }
for(int i=0;i
如果需要更短的代码,可以将累加和的循环与用随机正整数填充数组的循环组合起来。以下是生成的代码:

    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; 
    }
java.util.Random rand=new java.util.Random();
最终整数最大值=100;
double[]a=新的double[1+兰特下染色(最大尺寸)];
双和=0.0;
对于(int i=0;i
类似于@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;
}
publicstaticdouble[]randouble(整数大小,双和){
double total=0,doubles[]=新的double[size];

对于(int i=0;in个随机数:

r1 = random(0,1)
r2 = random(0, 1-r1)
r3 = random(0, 1-r1-r2)
...
r(n) = 1 - r1-r2-f3...-r(n-1)

如果它们必须相加,那么它们就不是完全随机的。例如,我有一个数组,其中有10000个元素,每个元素都有自己的概率(元素是一个有两个字段的对象1)数字2)概率),所有概率之和必须是1!那么我如何在没有随机的情况下做到这一点呢?生成随机数(介于0和array.length之间)并在生成的数字处递增元素。执行此操作
n
次。然后,将所有元素除以
n
,就得到了元素的概率(总和为1)。重复:@cdhowie:为什么?取一个间隔(介于0和预期总和之间)然后在这个区间内随机放置点。告诉我这显然是非随机的。谢谢,但是如果我想有100000个值,所有值的总和都是1!我怎么做?在这种情况下,按照纪尧姆说的做。不过,你应该在原来的问题中提到,3和100000之间有很大的区别:-D是的,你是对的,对不起f或者不清楚的问题是的,这很好!谢谢:)+1-但应该注意的是,fp舍入错误可能意味着数字的总和不是1.0。@Stephen C:很好。希望浮点舍入错误不会对程序的行为产生重大影响。