【问题标题】:Generate 20 random number in a range with enthropy在具有熵的范围内生成 20 个随机数
【发布时间】:2015-11-03 23:35:40
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • 不清楚你所说的“有熵”是什么意思。您是否使用该短语作为另一种表示您希望值是随机的方式?
  • 是的,我希望这些值是随机的,但我希望这些值彼此不同。因此,我希望它生成 5 个不同的数字,而不是生成例如五个 10。
  • 是否允许重复?
  • @pjs 不,不允许重复。也许在大约 10 次运行中重复一次就可以了,但一般不会:)
  • 如果你想要 20 个不同的数字加起来等于 50,这是不会发生的。 i=1..20 的 Sum(i) 是 210,大大大于 50。您将不得不有一些重复的值。

标签: algorithm random language-agnostic probability


【解决方案1】:

简单的方法: 生成 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 的东西。您还可以限制任何随机数的大小。

【讨论】:

  • 我会试一试并发布结果。谢谢 :)
  • 这可以采取任意数量的步骤,不是吗?如果不是,那么第 20 个数字将是 R20,因此它缺乏真正的随机性(因为它是由它的前辈定义的)。
  • 22, 11 1 8 3 2 5 3 0 0 0 1 1 0 0 0 0 0 0 0。所有测试都与此类似。这种方法总是首先出现更高的数字。有什么方法可以更随机地分配更高的数字?
  • @Aidan Gomez,是的,任意数量的步骤(随机),我不认为用户要求设定的步骤数量,但如果是这样,可以轻松修改以产生设定的数量步数。
  • @NickoPo 该死的你很擅长这个:)) 我需要时间来分析一切:)))
【解决方案2】:

获得k个总和为N的随机值的一种相当简单的方法是创建一个大小为k+1的数组,将值0和N相加,然后用k-1个随机生成的介于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]

【讨论】:

    猜你喜欢
    • 2018-04-08
    • 2010-12-24
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 2015-05-25
    • 2010-09-22
    相关资源
    最近更新 更多