随机生成元组(A,B),使A + B <= C?

时间:2015-05-26 22:32:09

标签: random

在评论中讨论后,我必须注意,这里使用的术语不是数学上下文,而是编程上下文。

如何统一生成自然数AB的随机元组,以便A + B <= C,其中C是常数?

符合条件的每个可能的元组都应该有相同的生成机会。出于此问题的目的,自然数表示大于或等于1的正整数。

错误的解决方案(只是为了解释这个问题):从A1随机C,从{{B随机A 1}}到C。这样你就可以得到一个元组A = 1作为元组A = C,但你有第一类C个元组,第二类元组只有1元组,所以这些类型的单个元组不会以相同的概率出现。

2 个答案:

答案 0 :(得分:3)

对于给定的自然数C,有(C-1)* C / 2可能的自然数 * 元组,其中A + B <= C

e.g。 C = 5,10个可能的自然数元组是:

(1,1), (1,2), (1,3), (1,4)
(2,1), (2,2), (2,3)
(3,1), (3,2)
(4,1)

所以你可以选择[1,(C-1)* C / 2]之间的随机值,并根据它找到元组。

为了更容易找到元组,想象一下这个列表加倍,三角形翻转并适合自己:

(1,1), (1,2), (1,3), (1,4), (4,1)
(2,1), (2,2), (2,3), (3,2), (3,1)
(3,1), (3,2), (2,3), (2,2), (2,1)
(4,1), (1,4), (1,3), (1,2), (1,1)

现在你只需要一个随机数作为[1,C-1]范围内的行,一个作为[1,C]

范围内的列

如果行+列&lt; = C则A =行,B =列

否则A = C - 行,B = C + 1 - 列

(*)将自然数的定义作为&#34;从1&#34开始的正整数;由OP给出,这不是自然数的唯一可能定义

答案 1 :(得分:1)

修改了更新的问题

生成两个数字:

  • X~U(1,C)

  • Y~U(1,C - X)

现在掷硬币:

  • 概率为1/2, A&lt; -X,B&lt; -Y
  • 概率为1/2, A&lt; -Y,B&lt; - X
相关问题