Todo mundo aqui fez um ótimo trabalho explicando como o código funciona e mostrando como você pode construir seus próprios exemplos, mas aqui está uma resposta teórica da informação mostrando por que podemos razoavelmente esperar que exista uma solução que a pesquisa de força bruta acabará encontrando.
As 26 letras minúsculas diferentes formam nosso alfabeto Σ
. Para permitir a geração de palavras de diferentes comprimentos, adicionamos ainda um símbolo terminador ⊥
para gerar um alfabeto estendido Σ' := Σ ∪ {⊥}
.
Let α
Ser um símbolo e X uma variável aleatória distribuída uniformemente sobre Σ'
. A probabilidade de obter esse símbolo, P(X = α)
e seu conteúdo informativo I(α)
, são dados por:
P (X = α) = 1 / | Σ '| = 1/27
I (α) = -log₂ [P (X = α)] = -log₂ (1/27) = log₂ (27)
Para uma palavra ω ∈ Σ*
e sua ⊥-
contraparte finalizada ω' := ω · ⊥ ∈ (Σ')*
, temos
I (ω): = I (ω ') = | ω' | * log₂ (27) = (| ω | + 1) * log₂ (27)
Como o gerador de números aleatórios pseudo-aleatórios (PRNG) é inicializado com uma semente de 32 bits, podemos esperar a maioria das palavras com comprimento de até
λ = piso [32 / log₂ (27)] - 1 = 5
para ser gerado por pelo menos uma semente. Mesmo se procurássemos uma palavra de 6 caracteres, ainda teríamos sucesso em 41,06% do tempo. Não é muito pobre.
Em 7 letras, estamos olhando para mais perto de 1,52%, mas eu não tinha percebido isso antes de tentar:
#include <iostream>
#include <random>
int main()
{
std::mt19937 rng(631647094);
std::uniform_int_distribution<char> dist('a', 'z' + 1);
char alpha;
while ((alpha = dist(rng)) != 'z' + 1)
{
std::cout << alpha;
}
}
Veja a saída: http://ideone.com/JRGb3l