更に条件が追加された場合のP(A∩B∩C)の取り得る範囲の計算。
コード
#2022 Q1(4) 2024.7.28
# 定数
total_points = 16
PA = 3 / 4
PB = 3 / 4
PC = 3 / 4
PAB = 9 / 16
PAC = 9 / 16
PBC = 9 / 16
# 結果を格納するリスト
valid_probabilities = []
# 最小値と最大値を取るときの組み合わせを格納する変数
min_combination = None
max_combination = None
min_value = float('inf')
max_value = float('-inf')
# 各エリアの点数の範囲を狭める
for n1 in range(total_points // 3 + 1):
for n2 in range((total_points - 3 * n1) // 3 + 1):
for n3 in range(total_points - 3 * n1 - 3 * n2 + 1):
n4 = total_points - 3 * n1 - 3 * n2 - n3
if n4 < 0:
continue
calc_PA = (n1 + 2 * n2 + n4) / total_points
calc_PB = (n1 + 2 * n2 + n4) / total_points
calc_PC = (n1 + 2 * n2 + n4) / total_points
calc_PAB = (n2 + n4) / total_points
calc_PAC = (n2 + n4) / total_points
calc_PBC = (n2 + n4) / total_points
# 条件を満たすか確認
if (abs(calc_PA - PA) < 1e-9 and
abs(calc_PB - PB) < 1e-9 and
abs(calc_PC - PC) < 1e-9 and
abs(calc_PAB - PAB) < 1e-9 and
abs(calc_PAC - PAC) < 1e-9 and
abs(calc_PBC - PBC) < 1e-9):
current_PABC = n4 / total_points
valid_probabilities.append(current_PABC)
if current_PABC < min_value:
min_value = current_PABC
min_combination = (n1, n2, n3, n4)
if current_PABC > max_value:
max_value = current_PABC
max_combination = (n1, n2, n3, n4)
# 最小値と最大値を表示
min_PABC = min_value if valid_probabilities else None
max_PABC = max_value if valid_probabilities else None
# 結果の表示
print(f"最小値: {min_PABC}")
print(f"最大値: {max_PABC}")
print(f"最小値を取るときのN1, N2, N3, N4: {min_combination}")
print(f"最大値を取るときのN1, N2, N3, N4: {max_combination}")
最小値: 0.375
最大値: 0.4375
最小値を取るときのN1, N2, N3, N4: (0, 3, 1, 6)
最大値を取るときのN1, N2, N3, N4: (1, 2, 0, 7)
アルゴリズム
1.定数の設定
- 総点数と目標とする確率を設定します。
2.初期化
- 結果を保存するリストと、最小値・最大値、およびそのときの組み合わせを保存する変数を用意します。
3.探索
- 3つのネストされたループを使って、各エリアに割り当てる点数のすべての可能な組み合わせを試します。
- 各組み合わせについて、計算した確率が設定した目標確率と一致するかを確認します。
4.条件を満たす組み合わせの保存
- 条件を満たす場合、その組み合わせをリストに追加します。
- また、その組み合わせが現在の最小値または最大値である場合、それを更新します。
5.結果の表示
- 最小値と最大値、およびそれぞれの組み合わせを表示します。