Tout le monde ici a fait un bon travail en expliquant comment fonctionne le code et en montrant comment vous pouvez construire vos propres exemples, mais voici une information de réponse théorique en montrant pourquoi on peut raisonnablement s'attendre à une solution pour que la force brute de recherche finiront par trouver.
Les 26 lettres minuscules de notre alphabet Σ
. Pour permettre de générer des mots de différentes longueurs, nous avons encore ajouter un terminator symbole ⊥
de rendement de l'étendue de l'alphabet Σ' := Σ ∪ {⊥}
.
Laissez - α
être un symbole et X une variable aléatoire uniformément distribué sur Σ'
. La probabilité d'obtention de ce symbole, P(X = α)
, et son contenu de l'information, I(α)
, sont donnés par:
P(X = α) = 1/|Σ'| = 1/27
I(α) = -log₂[P(X = α)] = -log₂(1/27) = log₂(27)
Pour un mot - ω ∈ Σ*
et son ⊥-
résilié homologue ω' := ω · ⊥ ∈ (Σ')*
, nous avons
I(ω) := I(ω') = |ω'| * log₂(27) = (|ω| + 1) * log₂(27)
Depuis le Générateur de nombres Pseudo-aléatoires (PRNG) est initialisé avec un 32 bits de la graine, on peut s'attendre à la plupart des mots de longueur jusqu'à
λ = sol[32/log₂(27)] - 1 = 5
pour être généré par au moins une graine. Même si nous étions à la recherche pour une de 6 caractères, de mots, nous en serions encore à succès sur 41.06% du temps. Pas trop mal.
Pour 7 lettres nous regardons de plus près à 1,52%, mais je n'avais pas réalisé qu'avant de lui donner un essai:
#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