我正在尝试找出如何使用蒙特卡罗模拟来模拟有偏见的赌博问题。
问题是: 模拟两个玩家抛硬币; A和B。 玩家 A 有 0.55 的获胜机会。玩家 B 有 0.45 的机会。 每个玩家的起价为 3 美元。 如果一名玩家获胜,他们会从另一名玩家那里拿走 1 美元。 当一名玩家拥有所有的钱或者已经玩了 25 次迭代时,游戏结束。 然后我想绘制玩家获胜的相对频率,然后运行这么多次以获得玩家 A 和玩家 B 赢得所有钱的估计。
我所坚持的是进行蒙特卡洛模拟并计算一个玩家积累所有其他玩家的钱的概率。
到目前为止,我可以生成一款游戏的数据框并绘制它。
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
}
运行 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