例如:Generatare 3个数字,总和为11.
范围:
> 1到3之间的值.
> 5到8之间的值.
> 3到7之间的值.
这个例子的生成数字可以是:2,5,4.
可以像这样生成像N个数字一样不变的模数:
generate random numbers of which the sum is constant
但是我无法做到这一点.
或者通过产生N个随机值,将它们相加,然后将常数和除以随机和,然后将每个随机数乘以该商G0001.
主要问题,为什么我不能采用这些解决方案是我的每个随机值都有不同的范围,我需要这些值与范围均匀分布(例如,在最小/最大值时不发生频率发生,如果我切断值其小于/大于最小/最大).
我也想到了一个soultion,取一个随机数(在该例子中,值为1,2或3),生成范围内的值(min / max或min之间),剩余的总和取决于哪个更小),减去我给定总和的数量,并保持一切,直到一切都分布.但是这将是可怕的无效.我真的可以使用算法的运行时间固定的方式.
我试图让它运行在Java.但是,该信息不是importend,除非有人已经有一个解决方案准备好了.所有我需要的是一个算法的描述或想法.
解决方法
Generate k numbers that sums to a number y,such that x_1,…,x_k –
each has a limit.
第二个可以通过简单地减少数字的下限来实现 – 所以在你的例子中,它相当于:
Generate 3 numbers such that x1 <= 2; x2 <= 3; x3 <= 4; x1+x2+x3 = 2
请注意,第二个问题可以通过各种方式解决,其中之一是:
生成每个元素的h_i重复列表 – 其中h_i是元素i的限制 – 重新排列列表,并选择第一个元素.
在你的例子中,列表是:[x1,x1,x2,x3,x3] – 洗牌并选择前两个元素.
(*)请注意,使用fisher-yates算法可以完成列表的混洗. (您可以在通过所需限制后中间中止算法).