所以我有很多瓶,比如1000瓶,给定数量的盒子,例如10瓶。我需要把瓶子放在盒子里,但要随机地,在一个范围内。那这是什么意思?例如,如果我说我的范围是5%到50%,比我需要的1000盒,并分发给我的10盒,从50每盒开始,以500每盒结束。这10个盒子中的每一个都必须有一个介于50到500之间的数字,它们必须是瓶子。目前,我只是平分整件事:
private static int[] splitIntoChunks(int bottles,int boxes) {
int[] arr = new int[bottles];
int remain = boxes;
int partsLeft = bottles;
for (int i = 0; partsLeft > 0; i++) {
int size = (remain + partsLeft - 1) / partsLeft;
arr[i] = size;
remain -= size;
partsLeft--;
}
return arr;
}我试图找到我们最优雅的解决方案,考虑到我的范围也受到瓶子和盒子的数量的影响。
发布于 2021-05-24 11:21:01
我会按照以下的方式来做。首先,用瓶子的最小值填满所有的盒子。然后随机挑选一个盒子,如果没有超过最大值,就加一个瓶子。这不是最快的解决方案,但我认为这是一个简单而健壮的解决方案。
import java.util.Arrays;
import java.util.Random;
public class MyClass {
private static final Random random = new Random(123);
private static int[] splitIntoChunks(int bottles,int boxes, double lower, double upper) {
int[] arr = new int[boxes];
int remain = bottles;
int minBottles = (int) Math.round(bottles * lower);
int maxBottles = (int) Math.round(bottles * upper);
for (int i = 0; i < arr.length; i++) {
arr[i] = minBottles;
remain -= minBottles;
}
while(remain > 0) {
int i = random.nextInt(arr.length);
if( arr[i] >= maxBottles ) {
continue;
}
arr[i] += 1;
remain -= 1;
}
return arr;
}
public static void main(String args[]) {
System.out.println(Arrays.toString(splitIntoChunks(1000,10, 5.0/100.5, 50.0/100.0)));
}
}输出
[98, 112, 106, 91, 94, 96, 101, 116, 86, 100]注意:如果没有具有上下界的解决方案,则不进行检查。但这很容易实现。
https://stackoverflow.com/questions/67668918
复制相似问题