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

时间:2018-06-25 08:13:33

标签: java random integer logic

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

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

我该如何将一个整数(例如100)划分为5个随机部分,以使第一个或第二个部分始终最大,然后再细分为第三,第四和第五部分?

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

例如,我想要的...

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

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

感谢您的时间!

4 个答案:

答案 0 :(得分: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确保它们按升序排列。

答案 1 :(得分:0)

从以下范围取四个数字:

So practically you cannot perform its reverse operation.

然后将每个数字除以四。

第五个数字为4 to n-1

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

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

希望有帮助。

答案 2 :(得分:0)

一种简单的算法是将数字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 :(得分:0)

执行此操作并保持正确分发的最有效方法-看起来像这样。

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。然后使用建议的算法两次。