﻿import numpy as np  # モジュールNumpyをnpという名前でインポート
n = 200000  # 試行回数
X = np.zeros(n)  # A君のカードの数字を格納する配列
Y = np.zeros(n)  # B君のカードの数字を格納する配列
np.random.seed(1)  # 乱数のシード値を固定
for i in range(n):
    cards = np.array([-2, -1, -1, 2])  # 4枚のカードの情報
    # A君が抜き出すカードの添え字を{1,2,3,4}から無作為に選ぶ
    k_a = np.random.choice(4, size = 1)[0]
    X[i] = cards[k_a]
    cards = np.delete(cards, k_a)  # cardsからcards[k_a]を取り除く
    # B君が抜き出すカードの添え字を{1,2,3}から無作為に選ぶ
    k_b = np.random.choice(3, size = 1)[0]
    Y[i] = cards[k_b]

# モンテカルロ法で求めたE(XY)を表示 (※参考：理論値は-1/2)
print(np.mean(X * Y))
# モンテカルロ法で求めたE(X)E(Y)を表示 (※参考：理論値は1/4)
print(np.mean(X) * np.mean(Y))
# モンテカルロ法で求めたV(X+Y)を表示 (※参考：理論値は3)
print(np.var(X + Y))
# モンテカルロ法で求めたV(X)+V(Y)を表示 (※参考：理論値は9/2)
print(np.var(X) + np.var(Y))