import numpy as np  # モジュールNumpyをnpという名前でインポート
n = 300000  # 試行回数
# A，B，C，Dの4人とも自分の名刺が入った封筒を選んだ状態
individual_cards = ['card_A', 'card_B', 'card_C', 'card_D']
# ベクトルxには，全員が他人の名刺が入った封筒を選んだ場合は1を格納し，
# そうでない場合は0を格納する．
x = [0] * n  # 初期状態では，xはn次元零ベクトル
np.random.seed(1)  # 乱数のシード値を固定
for i in range(n):
    # カードを無作為に4枚選ぶ
    selected_cards = np.random.choice(individual_cards, 4, replace=False)
    # 全員が他人の名刺が入った封筒を選んだ場合
    if np.all(selected_cards != individual_cards):
        x[i] = 1  # 第i成分を0から1に変更

# 確率の表示
print(sum(x) / n)  # モンテカルロ法
print(3/8)  # 参考：理論値