Tutti qui hanno fatto un ottimo lavoro nel spiegare come funziona il codice e nel mostrare come è possibile costruire i propri esempi, ma ecco una risposta teorica informativa che mostra perché possiamo ragionevolmente aspettarci che esista una soluzione che la ricerca della forza bruta alla fine troverà.
Le 26 diverse lettere minuscole formano il nostro alfabeto Σ
. Per consentire la generazione di parole di lunghezze diverse, aggiungiamo inoltre un simbolo di terminazione ⊥
per produrre un alfabeto esteso Σ' := Σ ∪ {⊥}
.
Sia α
un simbolo e X una variabile casuale distribuita uniformemente Σ'
. La probabilità di ottenere quel simbolo, P(X = α)
e il suo contenuto informativo I(α)
, sono date da:
P (X = α) = 1 / | Σ '| = 1/27
I (α) = -log₂ [P (X = α)] = -log₂ (1/27) = log₂ (27)
Per una parola ω ∈ Σ*
e la sua ⊥-
controparte terminata ω' := ω · ⊥ ∈ (Σ')*
, abbiamo
I (ω): = I (ω ') = | ω' | * log₂ (27) = (| ω | + 1) * log₂ (27)
Poiché il generatore di numeri pseudorandom (PRNG) è inizializzato con un seme a 32 bit, possiamo aspettarci la maggior parte delle parole di lunghezza fino a
λ = piano [32 / log₂ (27)] - 1 = 5
essere generato da almeno un seme. Anche se dovessimo cercare una parola di 6 caratteri, avremmo comunque successo circa il 41,06% delle volte. Non troppo malandato.
Per 7 lettere ci stiamo avvicinando all'1,52%, ma non mi ero reso conto che prima di provarlo:
#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;
}
}
Vedi l'output: http://ideone.com/JRGb3l