让我们的分布都是均匀的,第一个 (
A
) 的边界为 (ψ,Ψ)
,第二个 (B
) 的边界为 (φ,Φ)
。 A.random() > B.random()
的概率是多少?
# A>B? #
# ------------------------------------------------------------ #
# φ Φ ψ+++++++++Ψ ==> ψ >= Φ : ALWAYS a max (100%)
# ψ---------Ψ φ Φ ==> φ >= Ψ : NEVER a max (0%)
# ψ-------φ????Ψ Φ ==> Φ >= Ψ >= φ : SOMETIMES a max
# φ ψ????Φ+++++++++++Ψ ==> Ψ >= Φ >= ψ : SOMETIMES a max
到目前为止我已经想出了这个,但我不知道如何完成它:
if ψ >= Φ: # ALWAYS a max (ψ >= Φ)
return 1
elif φ >= Ψ: # NEVER a max (φ >= Ψ)
return 0
elif Φ >= Ψ and Ψ >= φ: # SOMETIMES a max (Φ >= Ψ >= φ)
range_A = Ψ - ψ
range_B = Φ - φ
overlap = Ψ - φ # [???? region]
overlap_chance = <<<X>>>
return overlap_chance
elif Ψ >= Φ and Φ >= ψ: # SOMETIMES a max (Ψ >= Φ >= ψ)
range_A = Ψ - ψ
range_B = Φ - φ
overlap = Φ - ψ # [???? region]
overlap_chance = <<<X>>>
all_good = Ψ - Φ # [++++ region]
all_good_chance = all_good / range_chosen
return overlap_chance + all_good_chance
我该如何计算
overlap_chance
?
我最好的猜测是,当两者都在该区域内时,这只是 50/50 (
(overlap / range_A) * (overlap / range_B) * 0.5
),但除了“我的直觉是这么说的”之外,我似乎无法提出令人信服的证据。
注 1:我将针对我的用例重复运行此代码,并且如果可能的话,宁愿不运行模拟。准确性对于证明稳健性也很重要(假设浮点运算正确)。
注2:我看到问题“如何使用正态分布来计算一个玩家在游戏中比另一个玩家获得更多分数的概率?”似乎很相似,但我没有使用R的经验,也没有理解如何将其应用于均匀分布。因此我自己在上面进行了尝试。
[1] 得到
overlap chance
那么,每种情况的重叠将是
[2]并回答标题问题,
我假设如下,
那么,
def chance_of_A_bigger_than_B(a1, a2, b1, b2):
a_range = a2 - a1
b_range = b2 - b1
# a, b probabilities per each bound range
# There could be a nicer way to write the code but since there's only 6 cases, I didn't bother
if a1 <= a2 <= b1 <= b2:
a_range_probs = [1, 0, 0]
b_range_probs = [0, 0, 1]
elif a1 <= b1 <= a2 <= b2:
a_range_probs = [(b1 - a1) / a_range, (a2 - b1) / a_range, 0]
b_range_probs = [0, (a2 - b1) / (b2 - b1), (b2 - a1) / (b2 - b1)]
elif a1 <= b1 <= b2 <= a2:
a_range_probs = [(b1 - a1) / a_range, (b2 - b1) / a_range, (a2 - b2) / a_range]
b_range_probs = [0, (b2 - b1) / b_range, 0]
elif b1 <= b2 <= a1 <= a2:
a_range_probs = [0, 0, (a2 - a1) / a_range]
b_range_probs = [(b2 - b1) / b_range, 0, 0]
elif b1 <= a1 <= b2 <= a2:
a_range_probs = [0, (b2 - a1) / a_range, (a2 - b2) / a_range]
b_range_probs = [(a1 - b1) / b_range, (b2 - a1) / b_range, 0]
elif b1 <= a1 <= a2 <= b2:
a_range_probs = [0, (a2 - a1) / a_range, 0]
b_range_probs = [(a1 - b1) / b_range, (a2 - a1) / b_range, (b2 - a2) / b_range]
# calculate chance for each a, b matrix cell
final_prob = 0
for a_idx, a_prob in enumerate(a_range_probs):
for b_idx, b_prob in enumerate(b_range_probs):
chance_to_occur = a_prob * b_prob
chance_of_a_over_b = 0 if a_idx < b_idx else 0.5 if a_idx == b_idx else 1
# chance of a over b
# if a_idx < b_idx, a is always under b
# if a_idx > b_idx, a is always over b
# if a_idx == b_idx, in uniform distribution, 50% change for a to be bigger than b, thus 0.5
final_prob += chance_to_occur * chance_of_a_over_b
return final_prob