Я пытаюсь выяснить, как смоделировать предвзятую проблему азартных игр, используя моделирование Монте-Карло.
Проблема в следующем: Имитируйте двух игроков, бросающих монету; А и Б. Шанс на победу игрока А составляет 0,55. Игрок Б имеет шанс 0,45. Каждый игрок начинает с $3. Если один игрок выигрывает, он забирает у другого 1 доллар. Игра заканчивается, когда либо у одного игрока есть все деньги, либо когда сыграно 25 итераций. Затем я хочу построить график относительной частоты выигрышей игроков, а затем запустить это количество раз, чтобы получить оценку того, что игрок А и игрок Б выиграют все деньги.
На чем я застрял, так это на запуске симуляций Монте-Карло и вычислении вероятности того, что один игрок накопит все деньги другого игрока.
На данный момент я могу сгенерировать фрейм данных для одной игры и построить его график.
Game <- c('Bethany', 'Algernon') #outcomes in the game
#initialise an empty df
Games_data <- data.frame(Game = numeric(),
winner = character(),
Bethany_bank = numeric(),
Algernon_bank = numeric(),
Bethany_Freq = numeric(),
Algernon_Freq = numeric()
)
#intialise variables
count <- 26
i <- 1
temp_Bethany_bank <- 3
temp_Algernon_bank <- 3
#populate the data frame until 25 games or someone wins
while(i < count) {
temp_game <- i
temp_winner <- sample(Game, prob =c(0.55, 0.45), size = 1)
if (temp_winner == 'Bethany') {
temp_Bethany_bank <- temp_Bethany_bank + 1
temp_Algernon_bank <- temp_Algernon_bank - 1
} else {
temp_Bethany_bank <- temp_Bethany_bank - 1
temp_Algernon_bank <- temp_Algernon_bank + 1}
temp_Bethany_freq = 0.0
temp_Algernon_freq = 0.0
temp <- data.frame(Game = temp_game,
winner = temp_winner,
Bethany_bank = temp_Bethany_bank,
Algernon_bank = temp_Algernon_bank,
Bethany_Freq = temp_Bethany_freq,
Algernon_Freq = temp_Algernon_freq
)
Games_data <- rbind(Games_data, temp)
Games_data$Bethany_Freq <- cumsum(Games_data$winner == 'Bethany') / 1:nrow(Games_data)
Games_data$Algernon_Freq <- cumsum(Games_data$winner == 'Algernon') / 1:nrow(Games_data)
if (Games_data$Bethany_bank[i] <= 0 || Games_data$Algernon_bank[i] <= 0) {break} else {i <- i + 1}
}
#show the dataframe and the plot:
Games_data
ggplot(data = Games_data) +
geom_point(aes(x = Game, y = Bethany_Freq), color = 'coral', alpha = 0.8) + #Bethany's wins
geom_point(aes(x = Game, y = Algernon_Freq), color = 'steelblue', alpha = 0.8) + #Bethany's wins
geom_line(aes(x = Game, y = Bethany_Freq), color = 'coral') +
geom_line(aes(x = Game, y = Algernon_Freq), color = 'steelblue') +
theme_classic() +
labs(title = "Relative frequency plots for Bethany vs Algernon over 25 games")
Как я могу запустить это много раз, например 100 или 1000, сохранить результаты в объекте, построить график всех испытаний, а затем вычислить вероятность того, что один игрок получит все деньги?
Заранее здравствуйте!
Оберните свой код в функцию, вызовите ее, используя replicate
, а затем постройте их все, используя, скажем, marrangeGrob
из gridExtra
.
mc_sim <- function() {
... your code
# Additional code to account for a "no result" game.
if (i==count)
Games_data <- rbind(Games_data,
data.frame(Game = i,
winner = "no result",
Bethany_bank = temp_Bethany_bank,
Algernon_bank = temp_Algernon_bank,
Bethany_Freq = temp_Bethany_freq,
Algernon_Freq = temp_Algernon_freq))
Games_data
}
Запустите 9 симуляций и сохраните графики в список.
sim <- replicate(9, mc_sim(), simplify=FALSE)
sim_plots <- lapply(sim, \(x) ggplot(data = x) +
geom_point(aes(x = Game, y = Bethany_Freq), color = 'coral', alpha = 0.8) + #Bethany's wins
geom_point(aes(x = Game, y = Algernon_Freq), color = 'steelblue', alpha = 0.8) + #Bethany's wins
geom_line(aes(x = Game, y = Bethany_Freq), color = 'coral') +
geom_line(aes(x = Game, y = Algernon_Freq), color = 'steelblue') +
theme_classic()
)
Постройте их
library(gridExtra)
marrangeGrob(sim_plots, nrow=3, ncol=3,
top = "Relative frequency plots for Bethany vs Algernon over 25 games")
Вероятности победы каждого игрока можно рассчитать, используя относительные частоты.
prop.table(table(sapply(sim, \(x) x$winner[nrow(x)])))
Algernon Bethany
0.4444444 0.5555556
При большем количестве симуляций вероятности сходятся примерно к 35% и 62%, причем 3% — это «нет результата».
sim <- replicate(1000, mc_sim(), simplify=FALSE)
prop.table(table(sapply(sim, \(x) x$winner[nrow(x)])))
#Algernon Bethany no result
# 0.346 0.623 0.031
Спасибо, Эдвардс, мне не удалось заставить работать предложенные вами методы, но я выполнил тот же процесс с другим кодом и получил тот же результат. Спасибо!
Ох, хорошо. Вы поставили Games_data
в самой последней строке функции? Думаю, я мог пропустить это в своем ответе. Обновлено сейчас.
действительно хорошая визуализация! удобно marrangeGrob
упрощает работу по черчению! +1!
Посмотрите на функцию
replicate
. Вам нужно будет обернуть весь этот код в функцию.