在评论中讨论后,我必须注意,这里使用的术语不是数学上下文,而是编程上下文。
如何统一生成自然数A
和B
的随机元组,以便A + B <= C
,其中C
是常数?
符合条件的每个可能的元组都应该有相同的生成机会。出于此问题的目的,自然数表示大于或等于1的正整数。
错误的解决方案(只是为了解释这个问题):从A
到1
随机C
,从{{B
随机A
1}}到C
。这样你就可以得到一个元组A = 1
作为元组A = C
,但你有第一类C
个元组,第二类元组只有1元组,所以这些类型的单个元组不会以相同的概率出现。
答案 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)
现在掷硬币: