Alle hier haben großartige Arbeit geleistet, um zu erklären, wie der Code funktioniert, und um zu zeigen, wie Sie Ihre eigenen Beispiele erstellen können. Hier ist jedoch eine informationstheoretische Antwort, die zeigt, warum wir vernünftigerweise erwarten können, dass es eine Lösung gibt, die die Brute-Force-Suche irgendwann finden wird.
Die 26 verschiedenen Kleinbuchstaben bilden unser Alphabet Σ
. Um Wörter unterschiedlicher Länge zu generieren, fügen wir ein Terminatorsymbol hinzu ⊥
, um ein erweitertes Alphabet zu erhalten Σ' := Σ ∪ {⊥}
.
Sei α
ein Symbol und X eine gleichmäßig verteilte Zufallsvariable über Σ'
. Die Wahrscheinlichkeit, dieses Symbol zu erhalten, P(X = α)
und sein Informationsgehalt I(α)
sind gegeben durch:
P (X = α) = 1 / | Σ '| = 1/27
I (α) = -log₂ [P (X = α)] = -log₂ (1/27) = log₂ (27)
Für ein Wort ω ∈ Σ*
und sein ⊥-
terminiertes Gegenstück ω' := ω · ⊥ ∈ (Σ')*
haben wir
I (ω): = I (ω ') = | ω' | * log₂ (27) = (| ω | + 1) * log₂ (27)
Da der Pseudozufallszahlengenerator (PRNG) mit einem 32-Bit-Startwert initialisiert wird, können wir die meisten Wörter mit einer Länge von bis zu erwarten
λ = Boden [32 / log₂ (27)] - 1 = 5
von mindestens einem Samen erzeugt werden. Selbst wenn wir nach einem 6-stelligen Wort suchen würden, wären wir in 41,06% der Fälle immer noch erfolgreich. Nicht zu schäbig.
Bei 7 Buchstaben sehen wir näher an 1,52%, aber ich hatte das nicht bemerkt, bevor ich es ausprobiert habe:
#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;
}
}
Siehe die Ausgabe: http://ideone.com/JRGb3l