一尘不染

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

algorithm

我需要在Java中随机生成一个具有7个插槽的数组。所有这些插槽的值都必须至少为1,但总和必须为另一个已定义数字的总和。它们也都必须是一个int值,没有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


阅读 201

收藏
2020-07-28

共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");
    }
}
2020-07-28