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

Generate 20 random number in a range with enthropy

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

等给定数字的总和应等于 50。 有什么简单的方法吗?

谢谢

简单方法: 生成 1 和 X 之间的随机数:比如 R1; 从 X 中减去 R1,现在生成一个介于 1 和 (X - R1) 之间的随机数:比如 R2。重复该过程,直到所有 Ri 都加到 X 上:即 (X-Rn) 为零。注意:每个连续的数字 Ri 将小于第一个。如果您希望最终序列看起来更随机,只需排列生成的 Ri 数即可。 IE。如果您为 X=50 生成一个数组,如:22,11,9,5,2,1 - 将其置换以获得类似 9,22,2,11,1,5 的数组。您还可以限制任何随机数的大小。

获得总和为 N 的 k 个随机值的一种相当直接的方法是创建一个大小为 k+1 的数组,将值 0 和 N 相加,然后用 k-1 个随机生成的值填充数组的其余部分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]