Passeio Aleatório
Ruína do
Jogador
Caio VAOS
2025.1
O que é um Passeio Aleatório?
Passeios aleatórios são processos estocásticos nos quais uma variável muda seu valor de forma aleatória ao longo do tempo, conforme certas probabilidades.
Em sua forma mais simples, trata-se de uma sequência de passos em que, a cada instante, o valor atual é somado ou subtraído de uma constante (geralmente 1), com base em uma probabilidade fixa.
Esses modelos são amplamente utilizados para representar fenômenos como movimentos no mercado financeiro, variações em populações biológicas e, neste caso, o saldo de um jogador em um jogo de apostas.
Ruina do Jogador
A ruína do jogador é um problema clássico envolvendo passeios aleatórios com barreiras: uma inferior (a ruína, onde o saldo do jogador chega a zero) e uma superior (o objetivo ou limite de ganho).
O jogador começa com uma quantia inicial \(a\) e, a cada rodada, ganha $1 com probabilidade \(p\) ou perde $1 com probabilidade \(1 - p\).
O jogo continua até que o saldo atinja $0 (ruína) ou um valor máximo \(b\).
Metodologia - Descrição do Experimento
Nesse relatório, serão utilizados os seguintes parâmetros:
Quantia inicial: \(a=30\)
Probabilidade de ganhar $1 na rodada: \(p=0,4\)
Limite superior: \(b=60\)
Repetições : \(r=1000\)
O número de repetições corresponde à quantidade de simulações realizadas. Quanto maior esse número, mais precisa se torna a análise.
Para garantir a reprodutibilidade dos resultados, todas as simulações
foram realizadas com a semente fixa set.seed(123).
Parâmetros da Simulação
Defino os valores constantes utilizados ao longo da simulação:
a <- 30
b <- 60
r <- 1000
p <- 0.4
Núcleo do Processo
O jogador inicia com um saldo de \(a\), e o número de rodadas começa em zero.
A cada rodada, o saldo é atualizado com +1 ou -1, de acordo com a probabilidade especificada.
O processo se repete até que o jogador atinja uma das barreiras.
set.seed(123)
saldo <- a
rodadas <- 0
while (saldo > 0 && saldo < b) {
passo <- sample(c(-1, 1), size = 1, prob = c(1 - p, p))
saldo <- saldo + passo
rodadas <- rodadas + 1
}
rodadas
## [1] 154
Para obter uma estimativa confiável, repetimos o experimento \(r\) vezes, armazenando o número total de rodadas de cada repetição.
set.seed(123)
rodadas_por_repeticao <- c()
for (i in 1:r) {
saldo <- a
rodadas <- 0
while (saldo > 0 && saldo < b) {
passo <- sample(c(-1, 1), size = 1, prob = c(1 - p, p))
saldo <- saldo + passo
rodadas <- rodadas + 1
}
rodadas_por_repeticao <- c(rodadas_por_repeticao, rodadas)
}
# Os dez primeiros valores
head(rodadas_por_repeticao, 10)
## [1] 154 116 136 106 188 120 160 66 126 124
Resultado
Por fim, calculamos a média do número de rodadas entre todas as repetições:
mean(rodadas_por_repeticao)
## [1] 150.334
Função
Para melhorar a escalabilidade e facilitar a realização de novos
testes com diferentes parâmetros, encapsulamos o processo de simulação
em uma função chamada num_rodadas(), retornando um vetor
com o número de rodadas em cada simulação.
num_rodadas <- function(a, b, r = 1000, p = 0.4) {
rodadas_por_repeticao <- c()
for (i in 1:r) {
saldo <- a
rodadas <- 0
# Enquanto o saldo estiver entre 0 e b, o jogo continua
while (saldo > 0 && saldo < b) {
passo <- sample(c(-1, 1), size = 1, prob = c(1 - p, p))
saldo <- saldo + passo
rodadas <- rodadas + 1
}
rodadas_por_repeticao <- c(rodadas_por_repeticao, rodadas)
}
return(rodadas_por_repeticao)
}
set.seed(123)
mean(num_rodadas(30, 60))
## [1] 150.334
Nesta seção, analiso como a quantia inicial \(a\) influencia a duração esperada do jogo. Mantendo constantes os demais parâmetros (\(b=60\), \(p=0,4\), \(r=100\)).
Para isso, o jogo foi simulado para diferentes valores de \(a\), entre 1 e 59.
Função
Trata-se de uma pequena modificação da função anterior.
Nesta versão, o valor de \(a\) varia de acordo com o vetor fornecido como argumento, e para cada valor é computada a média do número de rodadas.
num_rodadas_var_a <- function(a_vals, b, r = 1000, p = 0.4) {
rodadas_por_val_a <- c()
for (a in a_vals) {
rodadas_a <- c()
for (i in 1:r) {
saldo <- a
rodadas <- 0
while (saldo > 0 && saldo < b) {
passo <- sample(c(-1, 1), size = 1, prob = c(1 - p, p))
saldo <- saldo + passo
rodadas <- rodadas + 1
}
rodadas_a <- c(rodadas_a, rodadas)
}
media_rodadas <- mean(rodadas_a)
rodadas_por_val_a <- c(rodadas_por_val_a, media_rodadas)
}
return(rodadas_por_val_a)
}
Resuldado
set.seed(123)
a_vals <- 1:59
valores <- num_rodadas_var_a(a_vals, 60)
df <- data.frame(a = a_vals, rodadas = valores)
Observa-se que, à medida que a quantia inicial aumenta, a média de rodadas também cresce — ou seja, o jogador tende a sobreviver por mais tempo. Esse padrão se mantém até aproximadamente o ponto \(a=50\). A partir daí, como o valor inicial está mais próximo da barreira superior (\(b=60\)), alguns trajetos chegam rapidamente ao sucesso logo nas primeiras rodadas, o que reduz a média geral de duração.
Em resumo: quanto maior a quantia inicial, maior tende a ser o tempo de sobrevivência no jogo, até certo ponto. Após esse limite, o jogador passa a ter mais chance de vencer rapidamente, o que encurta a duração média das partidas.
Também vale notar que, como consequência desse comportamento, a probabilidade de vitória — ou seja, de o jogador atingir o valor 60 sem antes cair em ruína — aumenta conforme o valor inicial \(a\) cresce. Essa probabilidade parte de zero e começa a crescer de forma acentuada com \(a\) próximo a 50.
A animação a seguir mostra como o número médio de rodadas até o fim do jogo varia conforme a probabilidade de vitória por rodada \(p\) muda, mantendo fixa a barreira superior \(b=60\) e variando a quantia inicial \(a\) entre 1 e 59.
Quando a probabilidade de vitória é baixa (próxima de 0), o número médio de rodadas é pequeno, e há uma forte tendência à ruína, independentemente da quantia inicial.
À medida que \(p\) aumenta, o número médio de rodadas também cresce, especialmente para valores intermediários de \(a\), indicando maior equilíbrio entre ruína e sucesso.
Essa etapa fui analisada nesse relaorio.
Para valores de \(p\) mais próximos de 1, o jogo tende a terminar rapidamente em vitória, principalmente quando \(a\) já é elevado, o que reduz novamente o número médio de rodadas.
Vale destacar ainda o comportamento espelhado dessa evolução em relação à probabilidade: os padrões observados para \(p\) próximo de 0 se invertem à medida que \(p\) se aproxima de 1.