R: биномиальная симуляция азартных игр Монте-Карло

Я пытаюсь выяснить, как смоделировать предвзятую проблему азартных игр, используя моделирование Монте-Карло.

Проблема в следующем: Имитируйте двух игроков, бросающих монету; А и Б. Шанс на победу игрока А составляет 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. Вам нужно будет обернуть весь этот код в функцию.

Edward 14.08.2024 03:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оберните свой код в функцию, вызовите ее, используя 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

Спасибо, Эдвардс, мне не удалось заставить работать предложенные вами методы, но я выполнил тот же процесс с другим кодом и получил тот же результат. Спасибо!

Lavacave 14.08.2024 08:54

Ох, хорошо. Вы поставили Games_data в самой последней строке функции? Думаю, я мог пропустить это в своем ответе. Обновлено сейчас.

Edward 14.08.2024 09:10

действительно хорошая визуализация! удобно marrangeGrob упрощает работу по черчению! +1!

ThomasIsCoding 14.08.2024 09:31

Другие вопросы по теме

Как я могу получить значение x через заданное значение y при использовании языка R для линейной регрессии?
Несоответствие между расчетом устойчивой ковариационной матрицы Python и R
Python: 3-сигма детектор «аномалий» количества заказов и строк
Загрузочные доверительные интервалы для прогнозируемых данных перекрываются, когда фиксированные эффекты не совпадают
В R при представлении данных (RCT) в таблице (желательно gtsummary) как включить тесты значимости как внутри группы, так и между группами? [картинка]
Как получить среднее значение по группе после множественного вменения?
Методы проверки независимости в непараметрической настройке
Ggcoef_model не отображает все сравнения взаимодействий
Как я могу использовать API Google Sheets для добавления некоторых данных в новую строку в Google Sheet?
Как получить среднюю/среднюю линию из нескольких точек (с разными значениями оси X) с помощью R (или Excel)?