連勝数と勝率の関係
from シャドウバースにおけるトス行為
10連勝ペースは勝率80%くらいで達成できると直観的に思ったが、確認したかったあんも.icon
正しそう
シミュレーションは結構乱暴にやっている
まとめて50回試行して、連勝数をスタックさせる
50連勝以上してしまったときに漏らしてしまう
現実的にありえない確率だけど
$ 0.8^{50}\approx 1.4272476927059638\times 10^{-5}\approx 0.00143\%
https://gyazo.com/19944e6022a4bcda605127988775de30
code:simulate_winning_streak.jl
using Plots, StatsBase, Printf
# ゲームのシミュレーション関数
function simulateGame(win_probability)
return rand() < win_probability #0以上1未満の範囲の浮動小数点数を一様分布からランダムに生成して比較
end
# 連勝数のシミュレーション関数
function simulateWinningStreak(num_games, win_probability)
streak = 0
max_streak = 0
for _ in 1:num_games
if simulateGame(win_probability)
streak += 1
max_streak = max(streak, max_streak)
else
streak = 0
end
end
return max_streak
end
# 連勝数のシミュレーション実行関数
function runSimulation(num_simulations, num_games, win_probability)
streaks = Int[]
for _ in 1:num_simulations
push!(streaks, simulateWinningStreak(num_games, win_probability))
end
return streaks
end
# ヒストグラムの作成と表示関数
function plotHistogram(streaks, num_games, win_probability)
bin_range = -0.5:(num_games+0.5)
hist = histogram(streaks,
bins=bin_range,
normalization=:probability,
legend=false,
xlabel="Winning Streak",
ylabel="Probability",
title="Winning Streak Simulation")
#フォーマットされた文字列を生成するためのマクロで小数点2桁に丸める
win_rate_text = @sprintf("Win Probability: %.2f", win_probability)
annotate!(hist, (num_games/3*2, 500, text(win_rate_text, :left, 10, :blue)))
# 最頻値の計算
mode_value = mode(streaks)
# 最頻値の注釈を追加
mode_text = @sprintf("Mode: %d", mode_value)
annotate!(hist, (num_games/3*2, 400, text(mode_text, :left, 10, :red)))
end
# シミュレーションのパラメータ設定と実行
num_simulations = 10000 # シミュレーション回数
num_games = 50 # 1回のゲームでの試行回数
win_probability = 0.80 # 勝率
streaks = runSimulation(num_simulations, num_games, win_probability)
# ヒストグラムの作成と表示
plotHistogram(streaks, num_games, win_probability)