【问题标题】:How can I distribute a pool to a given number of items within a given range如何将池分配给给定范围内的给定数量的项目
【发布时间】:2021-05-24 19:21:01
【问题描述】:

所以我有一些瓶子,例如 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;
}

考虑到我的产品系列也受到瓶子和盒子数量的影响,我正在努力寻找最优雅的解决方案。

【问题讨论】:

  • 不太清楚你所说的“实体”和“项目”是什么意思。
  • 谢谢,我试着用一个更有意义的例子来澄清它。

标签: java algorithm


【解决方案1】:

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

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]

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

【讨论】:

  • 超级创意!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 2015-06-10
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
相关资源
最近更新 更多