在给定范围内生成N个随机数,总计达到给定的总和

时间:2013-11-09 14:23:54

标签: java algorithm random

第一次来到Stackoverflow。我希望有人可以帮助我搜索算法。

我需要在给定范围内生成N个随机数,总计达到给定的总和!

例如:Generatare 3总计11的数字。

范围:

  1. 1到3之间的值。
  2. 5到8之间的值。
  3. 3到7之间的值。
  4. 此考试的生成数字可能是:2,5,4。

    我已经搜索了很多,无法找到我需要的解决方案。

    可以像这样生成类似N个常数和unsing模数的数字: generate random numbers of which the sum is constant 但我无法通过范围完成这项工作。

    或者通过生成N个随机值,将它们相加,然后将常数和除以随机和,然后将每个随机数乘以商as proposed here

    主要问题,为什么我不能采用这些解决方案的是我的每个随机值都有不同的范围,我需要在范围内均匀分布值(例如,在最小值/最大值时没有频率出现,如果我剪切则会发生关闭小于/大于最小/最大值的值。

    我还想到了一个灵魂,取一个随机数(在那个例子中,值1,2或3),生成该范围内的值(在最小值/最大值或最小值与其余总和之间,取决于这是较小的),减去我给定数量的那个数量,并保持这一点直到一切都被分配。但那将是非常无效的。我真的可以使用一种修复算法运行时的方法。

    我试图让它在Java中运行。但是那个Info不是那个importend,除非有人已经准备好了解决方案。我只需要一个算法的描述或想法。

3 个答案:

答案 0 :(得分:7)

首先,请注意问题等同于:

  

生成总和为y的k个数字,例如x_1,...,x_k -   每个都有一个限制。

第二个可以通过简单地减少数字的下限来实现 - 所以在你的例子中,它相当于:

  

生成3个数字,使得x1 <= 2; x2 <= 3; x3 <= 4; x1 + x2 + x3 = 2

请注意,第二个问题可以通过各种方式解决,其中之一是:

生成每个元素重复h_i的列表 - 其中h_i是元素i的限制 - 随机播放列表,然后选择第一个元素。

在您的示例中,列表为:[x1,x1,x2,x2,x2,x3,x3,x3,x3] - 随机播放并选择前两个元素。

(*)请注意,可以使用fisher-yates算法来对列表进行混洗。 (您可以在超过所需限制后在中间中止算法。)

答案 1 :(得分:6)

添加最小值。在这种情况下,1 + 5 + 3 = 9

11 - 9 = 2,所以你必须在三个数字之间分配2(例如:+ 2,+ 0,+ 0或+ 0,+ 1,+ 1)。

我为您留下余下的部分,在转换后创建统一分布相对容易。

答案 2 :(得分:2)

此问题相当于在2个位置上的最小值9上随机分配3

所以你从最小值(1/5/3)开始然后循环2次,生成[伪]随机值[0-2](3位置)并增加索引值。

e.g。

  • 开始1/5/3
  • 1st random = 1 ... increment index 1 ... 1/6/3
  • 2nd random = 0 ... increment index 0 ... 2/6/3

2 + 6 + 3 = 11

修改

第二次读到这个,我明白,这正是@KarolyHorvath所提到的。