首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将池分配给给定范围内的给定数量的项?

如何将池分配给给定范围内的给定数量的项?
EN

Stack Overflow用户
提问于 2021-05-24 08:30:24
回答 1查看 67关注 0票数 0

所以我有很多瓶,比如1000瓶,给定数量的盒子,例如10瓶。我需要把瓶子放在盒子里,但要随机地,在一个范围内。那这是什么意思?例如,如果我说我的范围是5%到50%,比我需要的1000盒,并分发给我的10盒,从50每盒开始,以500每盒结束。这10个盒子中的每一个都必须有一个介于50到500之间的数字,它们必须是瓶子。目前,我只是平分整件事:

代码语言:javascript
复制
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;
}

我试图找到我们最优雅的解决方案,考虑到我的范围也受到瓶子和盒子的数量的影响。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-24 11:21:01

我会按照以下的方式来做。首先,用瓶子的最小值填满所有的盒子。然后随机挑选一个盒子,如果没有超过最大值,就加一个瓶子。这不是最快的解决方案,但我认为这是一个简单而健壮的解决方案。

代码语言:javascript
复制
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)));
    }
}

输出

代码语言:javascript
复制
[98, 112, 106, 91, 94, 96, 101, 116, 86, 100]

注意:如果没有具有上下界的解决方案,则不进行检查。但这很容易实现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67668918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档