O Teorema do Macaco Infito: quanto tempo até sair Hamlet?
O Enunciado e Quase-Certeza
Probabilidades de palavras em particular com alfabetos finitos
Simulação
library(dplyr)
library(tibble)
library(rio)
palavras <- import("https://github.com/pythonprobr/palavras/blob/master/palavras.txt?raw=true") %>%
as_tibble()
palavras$tamanho <- stringr::str_length(palavras$a) # tamanho das palavras
Existem maneiras mais elegantes de armazenar os resultados desta simulação, mas eu fiz isso com pressa e - convenhamos - isso aqui é só um blog. Vamos ao passo a passo do desenho da simulação. Primeiro definimos parâmetros e objetos:
k <- 5 # número máximo de letras em uma palavra a ser encontrada
n <- 100 # número de tentativas de encontrar palavras entre 1 e k letras
matriz_tentativas <- rep(NA, each = k) # matriz vazia
tentativas <- double(length = k) # vetor vazio com tipo definido como de precisão dupla
for(a in 1:n) { # primeiro loop, o em cima da amostra
for(i in 1:k) { # segundo loop, onde tentamos encontrar as palavras
seq(1:a*n) %>% sample(size = 1) %>% set.seed() # semente nova sempre para evitar repetição
## esse procedimento da semente é discutível, não reproduzir cegamente
contador <- 1
indicador <- FALSE
while(indicador == FALSE) {
palavra <- sample(letters, size = i) %>%
paste(collapse = '') # sorteando uma palavra
if(palavra %in% palavras$a) {
indicador <- TRUE # se a palavra está no corpus do português, paramos o loop
} else {
contador <- contador + 1 # se não, contamos a tentativa e começamos de novo
}
}
tentativas[i] <- contador # salvamos quantas tentativas foram precisas
}
matriz_tentativas <- cbind(matriz_tentativas, tentativas) # juntamos todos os vetores com números de tentativas
print(paste("i =",i))
print(paste("a =",a))
}