如何在数组中生成加起来等于定义的总数的随机数?

2022-09-04 05:07:29

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

int a=10;

int[] ar = new int[7]
ar[0] = 1
ar[1] = 1
ar[2] = 2
ar[3] = 2
ar[4] = 1
ar[5] = 2
ar[6] = 1

我希望它生成类似的东西,但是如果int a = 15,则所有数字将按任何顺序总计为15


答案 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");
    }
}

答案 2

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

  1. 在数组中的每个元素中放置1,因为这是您的要求,您现在还有7个值要分配
  2. 在数组的 0 和最大索引之间滚动一个随机数,向该元素添加 1,然后从 7 中减去 1。执行此操作,直到 7 降至零。

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