今回はSNSで話題になっていた
直感に反する数学の問題を解く
プログラムに関してです。
解説動画はこちら
今回の問題は、とある数学者の考案した
「一見シンプルだが直感に反する確率パズル」
1.赤
2.緑
3.赤と緑が同じ
さてこの問題を考えてみてください。
解説
こちらの詳細な解説は
ながーいので、割愛します。
動画の中では 3:53 くらいから解説しています。
シミュレーションコード
こちらの確率をもとめるコードは
こんな感じになります。
google colab などで試してみてください。
ベイズの定理などを用いて
机上でかなり大変な計算をしないと
求めることは困難ですが
プログラムであれば
簡単にシミュレーションして
擬似値をもとめる事ができます。
ぜひ色々試してみてください。
それでは。
直感に反する数学の問題を解く
プログラムに関してです。
解説動画はこちら
今回の問題は、とある数学者の考案した
「一見シンプルだが直感に反する確率パズル」
というものです。
問題
100個のボールが入ったつぼがあります。
問題
100個のボールが入ったつぼがあります。
そのうちn個が赤で、100-n個が緑です。
ただし、nは0~100の間で一様分布しています。
つぼからボールをランダムに1つ取り出したところ、赤でした。
それを捨ててから、残り99個からボールを選ぶとき
次に引くボールの色は赤と緑どちらが多いでしょうか?
次に引くボールの色は赤と緑どちらが多いでしょうか?
1.赤
2.緑
3.赤と緑が同じ
さてこの問題を考えてみてください。
解説
こちらの詳細な解説は
ながーいので、割愛します。
動画の中では 3:53 くらいから解説しています。
シミュレーションコード
こちらの確率をもとめるコードは
こんな感じになります。
1.ランダムに赤いボールの個数を決める
2.赤を引いたら、次のボールを引く
3.二回目のボール、赤と緑どちらを引いたか集計する
import numpy as np
# シミュレーションの設定
num_trials = 100000 # 試行回数
n_balls = 100 # ボールの総数
data = []
# 結果を記録するための変数
red_first_count = 0
red_second_count = 0
green_second_count = 0
# シミュレーション
for _ in range(num_trials):
n_red = np.random.randint(0, n_balls + 1) # 0から100までのランダムな赤いボールの数
n_green = n_balls - n_red # 緑のボールの数
# 最初のボールをランダムに引く(赤または緑)
first_draw = np.random.choice(['red'] * n_red + ['green'] * n_green)
if first_draw == 'red':
# 最初に赤を引いたので、赤を1つ減らす
red_first_count += 1
n_red -= 1
# 次のボールを引く
second_draw = np.random.choice(['red'] * n_red + ['green'] * n_green)
# 次のボールの数を集計
if second_draw == 'red':
red_second_count += 1
else:
green_second_count += 1
tmp = [red_first_count,red_second_count,red_second_count/red_first_count,n_red]
data.append(tmp)
# 結果の計算
total_first_red = red_first_count
total_second_red = red_second_count
# 確率の計算
if total_first_red > 0:
p_second_red_given_first_red = total_second_red / total_first_red
print(f"P(second red | first red) = {p_second_red_given_first_red:.4f}")
else:
print("No trials with the first ball red.")
google colab などで試してみてください。
ベイズの定理などを用いて
机上でかなり大変な計算をしないと
求めることは困難ですが
プログラムであれば
簡単にシミュレーションして
擬似値をもとめる事ができます。
ぜひ色々試してみてください。
それでは。
