繁体   English   中英

设置 Java Array 中元素总和的限制

[英]Set limit on sum of elements in Java Array

我正在尝试创建一个数组,其中元素数从 3 随机到 20,其中所有元素的总和为 45。我的问题是我无法设置限制,因此总和不超过 45 的值。

假设有4个元素:

我的当前输出:15 21 19 26

我需要什么:7 11 23 4

public static void startGame(int[] cards) {
    cards = new int[45];
    Random rand = new Random();
    int sum = 45;
    int numStacks = 1;
    numStacks = rand.nextInt(18) + 3;
    
    for (int i = 0; i < numStacks; i++) {
        cards[i] = (rand.nextInt(45) + 1) - numStacks;
        sum += cards[i];
        System.out.println(cards[i]);
    }
}

你可以试试这个实现:

  public static void startGame() {
    Random rand = new Random();
    int sum = 45;
    int numStacks = 1;
    numStacks = rand.nextInt(18) + 3;
    int[] cards = new int[numStacks];
    int upperBound = 20;
    int lowerBound = 3;
    if(lowerBound*numStacks > sum || upperBound*numStacks < sum) {
        throw new IllegalArgumentException(String.format("Cannot make the stack - improper distribution for numStacks :%d upperBound: %d lowerBound: %d", numStacks, upperBound, lowerBound));
    }
    Arrays.fill(cards, lowerBound);
    for (int i = 0; i < sum; i++)
    {
        boolean keepCalculating = true;
        while(keepCalculating) {
            int randomIndex = rand.nextInt(numStacks);
            int nextValue = cards[randomIndex] + 1;
            if(nextValue <= upperBound) {
                cards[randomIndex] = nextValue;
                keepCalculating = false;
            }
        }
    }
    System.out.printf("numStacks: %d%n", numStacks);
    System.out.printf("cards: %s%n", Arrays.toString(cards));
    System.out.printf("sum: %d%n", Arrays.stream(cards).sum());
}

cards有结果。 示例运行:

numStacks: 7
cards: [7, 7, 5, 8, 5, 2, 11]
sum: 45

如果它不能创建堆栈,这里是它抛出的异常。

Exception in thread "main" java.lang.IllegalArgumentException: Cannot make the stack - improper distribution for numStacks :20 upperBound: 20 lowerBound: 3

如果您希望程序“始终”计算堆栈,则可以尝试以下代码:

  public static void startGame() {
    Random rand = new Random();
    int sum = 45;
    int numStacks = 1;
    int maxNumberOfCards = 18;
    int minNumberOfCards = 3;
    int upperBound = 20;
    int lowerBound = 3;
    boolean calculateValidNumberOfStacks = true;
    while(calculateValidNumberOfStacks) {
        int checkVal = rand.nextInt(maxNumberOfCards) + minNumberOfCards;
        if(lowerBound*checkVal < sum && upperBound*checkVal > sum) {
            numStacks = checkVal;
            calculateValidNumberOfStacks = false;
        }
    }
    int[] cards = new int[numStacks];
    Arrays.fill(cards, lowerBound);
    for (int i = 0; i < sum; i++) {
        boolean keepCalculating = true;
        while(keepCalculating) {
            int randomIndex = rand.nextInt(numStacks);
            int nextValue = cards[randomIndex] + 1;
            if(nextValue <= upperBound) {
                cards[randomIndex] = nextValue;
                keepCalculating = false;
            }
        }
    }
    System.out.printf("numStacks: %d%n", numStacks);
    System.out.printf("cards: %s%n", Arrays.toString(cards));
    System.out.printf("sum: %d%n", Arrays.stream(cards).sum());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM