Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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_Arrays_Algorithm_Random - Fatal编程技术网

Java 如何在一个数组中生成随机数,并将其相加为定义的总数?

Java 如何在一个数组中生成随机数,并将其相加为定义的总数?,java,arrays,algorithm,random,Java,Arrays,Algorithm,Random,我需要在Java中随机生成一个包含7个插槽的数组。所有这些插槽的值必须至少为1,但组合起来的总值必须为另一个定义的数字。它们也都需要是一个int值,1.5或0.9816465684646。 例如: 我希望它生成类似的结果,但是如果int a=15,所有的数字将以任何顺序总共15个实现一致性的一个好方法是,例如,将a=15单位填充到一个8元素数组中: 在数组中的每个元素中放入1,因为这是您的需求,现在您还有7个值要分配 在0和数组的最大索引之间滚动一个随机数,将该元素加1,然后从7中减去1。这样做

我需要在Java中随机生成一个包含7个插槽的数组。所有这些插槽的值必须至少为1,但组合起来的总值必须为另一个定义的数字。它们也都需要是一个int值,1.5或0.9816465684646。 例如:


我希望它生成类似的结果,但是如果int a=15,所有的数字将以任何顺序总共15个

实现一致性的一个好方法是,例如,将
a=15
单位填充到一个8元素数组中:

  • 在数组中的每个元素中放入1,因为这是您的需求,现在您还有7个值要分配
  • 在0和数组的最大索引之间滚动一个随机数,将该元素加1,然后从7中减去1。这样做直到7降到零

  • 通过这种方式,您将通过使每个元素的最小值为1来满足您的最小条件。然后以完全随机的方式分配剩余的总数。

    生成N个随机数并添加到给定总和的标准方法是将你的总和视为一条数字线,在该线上生成N-1个随机点,对它们进行排序,然后使用点之间的差作为最终值。要得到最小值1,首先从总和中减去N,运行给定的算法,然后将1加回到每个段

    public class Rand {
        public static void main(String[] args) {
            int count = 8;
            int sum = 100;
            java.util.Random g = new java.util.Random();
    
            int vals[] = new int[count];
            sum -= count;
    
            for (int i = 0; i < count-1; ++i) {
                vals[i] = g.nextInt(sum);
            }
            vals[count-1] = sum;
    
            java.util.Arrays.sort(vals);
            for (int i = count-1; i > 0; --i) {
                vals[i] -= vals[i-1];
            }
            for (int i = 0; i < count; ++i) { ++vals[i]; }
    
            for (int i = 0; i < count; ++i) {
                System.out.printf("%4d", vals[i]);
            }
            System.out.printf("\n");
        }
    }
    
    公共类{
    公共静态void main(字符串[]args){
    整数计数=8;
    整数和=100;
    java.util.Random g=new java.util.Random();
    整数VAL[]=新整数[计数];
    总和-=计数;
    对于(int i=0;i0;--i){
    vals[i]=vals[i-1];
    }
    对于(int i=0;i
    我的java很糟糕,所以我这里不提供实际的代码,因为它可能是错误的。我以前在SQL中做过同样的事情,所以我知道它是有效的

  • 让Y为您希望元素相加的总值
  • 以变量Z从1到X开始循环,其中X是数组中的数字元素(这里称为AR)
  • 在循环中,将AR(Z)设置为介于1和Y-X+Z之间的随机数
  • 从Y中减去新值,因此Y=Y-AR(Z)
  • 结束循环:返回步骤2,将Z前进1

  • 再加上@Kon所说的,你可以使用两个随机数而不是一个随机数来获得更多的随机性。即:

    Fill every element in the array with the value 1
    valuesToDistribute = a - array.length-1
    randomIndex = Roll a number between 0 and array.length-1
    randomValue = Roll a number between 1 and valuesToDistribute
    Add to randomIndex the value randomValue
    Subtract randomValue from valuesToDistribute
    Repeat until valuesToDistribute = 0
    

    这甚至可能值得一个
    算法
    tag.OP,你知道随机变量和概率分布吗?这个问题只有在你更准确地定义“随机”的含义后才能得到答案。+1,没有更好的解决方案。我在思考如何获得一致性。我的困境是他们可能太统一了。对于一个足够大的a,所有的数字都会非常接近,很难判断是否存在随机性。那么,我将如何改变你所说的,使其成为一个7元素数组?我只需要7个数字。当你的总和很大时,这会表现得很糟糕。@LeedianelCrocker操作员说他的值不会超过99。当
    a
    很大时,这会很慢。一个更有效的解决方案是Lee Daniel Crocker所描述的。这很有趣。你能展示一点代码,让我看看会发生什么吗?是的,我可能应该展示一些代码。给我几分钟。这是一个很好的方法,但当数字被限制为整数时,问题就更难了。魔鬼将出现在细节中。@TedHopp我不知道为什么整体性会产生问题。两个数字之间的平均差值仍然是N/sum
    Fill every element in the array with the value 1
    valuesToDistribute = a - array.length-1
    randomIndex = Roll a number between 0 and array.length-1
    randomValue = Roll a number between 1 and valuesToDistribute
    Add to randomIndex the value randomValue
    Subtract randomValue from valuesToDistribute
    Repeat until valuesToDistribute = 0