在具有enthropy的范围内生成20个随机数

时间:2015-11-03 23:35:40

标签: algorithm random language-agnostic probability

我正在寻找解决问题的方法。假设我有一个数字X,现在我想生成20个随机数,其总和等于X,但我希望这些随机数在它们中具有相似性。因此,例如,如果X = 50,则算法应生成

  • 3
  • 11
  • 0
  • 6
  • 19
  • 7

等。给定的numbres的总和应该等于50。 有没有简单的方法呢?

由于

2 个答案:

答案 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]