代码之家  ›  专栏  ›  技术社区  ›  Hideyoshi

Java-如何将整数分成5个随机部分

  •  1
  • Hideyoshi  · 技术社区  · 6 年前

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

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

    我怎样去把一个整数除以100,分成5个随机部分,这样第一个或两个部分总是最大的,然后我细分为第三个、第四个和第五个部分?

    现在,我知道我可以试着用随机整数生成器来实现它,但是问题是,我想我必须使用一些强制除法,比如把前70%的整数分成2部分,然后把剩下的20%分成2部分,总共5部分,但这样的方法总是会使第一部分比第五部分大,我想避免这样的情况……使它真正随机。

    我想要的,例如…

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

    我不知道如何编写这样一个函数的逻辑…所以,如果你对如何实现一个将整数随机分成3、4、5或6个真正随机大小/部分的函数有任何想法,请启发我!

    谢谢你的时间!

    4 回复  |  直到 6 年前
        1
  •  1
  •   Peter Lawrey    6 年前

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

    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 确保它们按升序排列。

        2
  •  0
  •   Andy Turner    6 年前

    一个简单的算法是将数字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)
    • 拆分点。获取(0) -> splitPoints.get(1)
    • splitPoints.get(3) ->100。
        3
  •  0
  •   Aman Chhabra    6 年前

    从以下范围中选取四个数字:

    4 to n-1
    

    然后把每个数字除以四。

    第五个号码是 n - (sum of other four) 是的。

    在给定的情况下,n是100。

    同样,这是一种实现方式,有上百种实现方式

    希望能有所帮助。

        4
  •  0
  •   Serge Breusov    6 年前

    最有效的方法是这样做,并保持适当的分配-看起来像这样。

    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%。或者生成nextDouble(0.2)+0.2,对于[0.2,0.4]范围的间隙。然后使用所提出的算法两次。