【问题标题】:Java - how to divide an integer into 5 random partsJava - 如何将一个整数分成 5 个随机部分
【发布时间】:2018-12-03 18:13:23
【问题描述】:

我正在开发一个 android 图形应用程序,在代码中的某个位置,我需要将一个矩形的宽度分成 5 个随机大小。

我的活动中有我的 randomintegerfunction(int min, int max),但这可以帮助我将它分成两部分。

如何将一个整数(比如说 100)分成 5 个随机部分,这样前一个或两个部分并不总是最大的,然后再细分为第三、第四和第五部分?

现在,我知道我可以尝试使用我的随机整数生成器来实现它,但问题是我认为我必须使用一些强制除法,例如将整数的前 70% 分成 2部分,然后将剩余的 20% 分成两部分,总共 5 个部分,但是这样的方法总是会使第一部分大于第五部分,我想避免这种情况......真正随机的。

例如,我想要什么...

第一部分可能是 7, 第二部分 25, 第三部分 5, 第四部分 40, 第五/最后/剩余部分 23. 加到 100(或任何整数)。

我不确定如何编写这样一个函数的逻辑......所以如果您对如何实现一个将整数随机分成 3 或 4 或 5 或 6 个真正随机大小的函数有任何想法/部分,请赐教!

感谢您的宝贵时间!

【问题讨论】:

  • 我没有得到so that the first one or two parts arent always the biggest 的部分。你不能把那个数字分成几部分后随机改变顺序吗?
  • 我会使用 Random 来获得 1-99 范围内的 4 个不同的数字,并将它们用作整个整数的“切点”。 e.g. suppose i got (2,25,40,90)- the widths would be (100-90, 90-40, 40-25, 25-2, 2-0)

标签: java random integer logic


【解决方案1】:

您可以从剩余数量中随机选择。

int[] nums = new int[5];
int total = 100;
Random rand = new Random();
for (int i = 0; i < nums.length-1; i++) {
    nums[i] = rand.nextInt(total);
    total -= nums[i];
}
nums[nums.length-1] = total;
Arrays.sort(nums);

这将选择一个随机数并确保总和始终相同。最后一个sort 确保它们按升序排列。

【讨论】:

  • 工作完美,一旦我从 for 循环定义中的 nums.length-1 中删除了 -1。在不删除 -1 的情况下,它没有为数组的第四个位置赋值。感谢您提供灵活的解决方案!
  • @Hideyoshi 它应该将循环后剩余的total 分配给nums[4] 位置。
  • 我按原样测试它(使用 nums.length-1),数组的第四个元素始终为 0。它总是像 23,12,34,0,5.. . 直到我删除了 -1
【解决方案2】:

一个简单的算法是将数字 1-99 放入一个列表中,将它们打乱,并将前 4 个元素作为您的“分割点”,即分割数字范围的位置。

List<Integer> splitPoints =
    IntStream.rangeClosed(1, 99)
        .boxed().collect(Collectors.toList());
Collections.shuffle(splitPoints);
splitPoints.subList(4, splitPoints.size()).clear();
Collections.sort(splitPoints);

现在,您有 4 个随机放置的分割点。范围来自:

  • 0 -> splitPoints.get(0)
  • splitPoints.get(0) -> splitPoints.get(1)
  • ...
  • splitPoints.get(3) -> 100。

【讨论】:

    【解决方案3】:

    从以下范围内取四个数字:

    4 to n-1
    

    然后将每个数字除以四。

    第五个数字是n - (sum of other four)

    在给定的情况下,n 为 100..

    这又是一种实现方式,有数百种实现方式

    希望对您有所帮助。

    【讨论】:

      【解决方案4】:

      执行此操作并保持适当分布的最有效方法 - 如下所示。

      1) 一般情况下。你需要将线分成N部分。

      generate N-1 doubles [0,1], add 0 and 1, and sort them -> x[i] = {0, ..., 1}
      N-1 point divide line into N parts -> 0=x[0]..x[1]; x[1]...x[2]; ... x[N]..x[N+1]=1
      scale each part to proper size -> len[i] = (x[i+1]-x[i])*total_length
      cast to int if needed
      

      2) 如果您需要大对象和小间隙 - 以理想的比例分割您的长度,例如 70% 用于对象,30% 用于间隙。或者为 [0.2,0.4) 范围生成 nextDouble(0.2)+0.2 用于间隙。然后使用建议的算法两次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-11
        • 2014-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-07
        • 1970-01-01
        • 2014-07-05
        相关资源
        最近更新 更多