Todos aquí hicieron un gran trabajo al explicar cómo funciona el código y al mostrar cómo puedes construir tus propios ejemplos, pero aquí hay una respuesta teórica de información que muestra por qué podemos esperar razonablemente que exista una solución que la búsqueda de fuerza bruta eventualmente encontrará.
Las 26 letras minúsculas diferentes forman nuestro alfabeto Σ
. Para permitir generar palabras de diferentes longitudes, agregamos un símbolo terminador ⊥
para obtener un alfabeto extendido Σ' := Σ ∪ {⊥}
.
Sea α
un símbolo y X una variable aleatoria distribuida uniformemente Σ'
. La probabilidad de obtener ese símbolo, P(X = α)
y su contenido de información I(α)
, están dados por:
P (X = α) = 1 / | Σ '| = 1/27
I (α) = -log₂ [P (X = α)] = -log₂ (1/27) = log₂ (27)
Para una palabra ω ∈ Σ*
y su ⊥-
contraparte terminada ω' := ω · ⊥ ∈ (Σ')*
, tenemos
I (ω): = I (ω ') = | ω' | * log₂ (27) = (| ω | + 1) * log₂ (27)
Dado que el generador de números pseudoaleatorios (PRNG) se inicializa con una semilla de 32 bits, podemos esperar la mayoría de las palabras de longitud hasta
λ = piso [32 / log₂ (27)] - 1 = 5
ser generado por al menos una semilla. Incluso si buscáramos una palabra de 6 caracteres, tendríamos éxito aproximadamente el 41.06% del tiempo. No está nada mal.
Para 7 letras, estamos mirando más cerca del 1,52%, pero no me había dado cuenta antes de intentarlo:
#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;
}
}
Ver la salida: http://ideone.com/JRGb3l