Tout le monde ici a fait un excellent travail pour expliquer comment le code fonctionne et montrer comment vous pouvez construire vos propres exemples, mais voici une réponse théorique d'information montrant pourquoi nous pouvons raisonnablement nous attendre à une solution que la recherche par force brute trouvera finalement.
Les 26 lettres minuscules différentes forment notre alphabet Σ
. Pour permettre de générer des mots de différentes longueurs, nous ajoutons en outre un symbole de terminaison ⊥
pour produire un alphabet étendu Σ' := Σ ∪ {⊥}
.
Soit α
un symbole et X une variable aléatoire uniformément répartie Σ'
. La probabilité d'obtenir ce symbole P(X = α)
et son contenu d'information I(α)
sont données par:
P (X = α) = 1 / | Σ '| = 1/27
I (α) = -log₂ [P (X = α)] = -log₂ (1/27) = log₂ (27)
Pour un mot ω ∈ Σ*
et son ⊥-
homologue terminé ω' := ω · ⊥ ∈ (Σ')*
, nous avons
I (ω): = I (ω ') = | ω' | * log₂ (27) = (| ω | + 1) * log₂ (27)
Étant donné que le générateur de nombres pseudo-aléatoires (PRNG) est initialisé avec une graine 32 bits, nous pouvons nous attendre à la plupart des mots de longueur allant jusqu'à
λ = étage [32 / log₂ (27)] - 1 = 5
à générer par au moins une graine. Même si nous devions rechercher un mot à 6 caractères, nous réussirions quand même environ 41,06% du temps. Pas trop mal.
Pour 7 lettres, nous nous rapprochons de 1,52%, mais je ne l'avais pas réalisé avant de l'essayer:
#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;
}
}
Voir la sortie: http://ideone.com/JRGb3l