[英]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.