我正在寻找解决问题的方法。假设我有一个数字X,现在我想生成20个随机数,其总和等于X,但我希望这些随机数在它们中具有相似性。因此,例如,如果X = 50,则算法应生成
等。给定的numbres的总和应该等于50。 有没有简单的方法呢?
由于
答案 0 :(得分:2)
简单方法: 生成1到X之间的随机数:比如R1; 从X中减去R1,现在生成1和(X - R1)之间的随机数:比如说R2。重复该过程直到所有Ri加到X:即(X-Rn)为零。注意:每个连续数字Ri将小于第一个。如果您希望最终序列看起来更随机,只需置换生成的Ri数字即可。即如果你为X = 50生成一个数组,如:22,11,9,5,2,1 - 将它置换为9,22,2,11,1,5之类的东西。您还可以限制任何随机数的大小。
答案 1 :(得分:0)
获得总和为N的k个随机值的一种相当简单的方法是创建一个大小为k + 1的数组,添加值0和N,并用1到1之间随机生成的k-1值填充数组的其余部分。 N-1。然后对数组进行排序并获取连续对之间的差异。
这是Ruby中的一个实现:
def sum_k_values_to_n(k = 20, n = 50)
a = Array.new(k + 1) { 1 + rand(n - 1) }
a[0] = 0
a[-1] = n
a.sort!
(1..(a.length - 1)).collect { |i| a[i] - a[i-1] }
end
p sum_k_values_to_n(3, 10) # produces, e.g., [2, 3, 5]
p sum_k_values_to_n # produces, e.g., [5, 2, 3, 1, 6, 0, 4, 4, 5, 0, 2, 1, 0, 5, 7, 2, 1, 1, 0, 1]