Wszyscy tutaj wykonali świetną robotę, wyjaśniając, jak działa kod i pokazując, jak można konstruować własne przykłady, ale oto teoretyczna odpowiedź informacyjna pokazująca, dlaczego możemy słusznie oczekiwać rozwiązania, które w końcu znajdzie brutalne wyszukiwanie.
26 różnych małych liter tworzy nasz alfabet Σ. Aby umożliwić generowanie słów o różnych długościach, dodajemy dodatkowo symbol terminatora, ⊥aby uzyskać rozszerzony alfabet Σ' := Σ ∪ {⊥}.
Niech αbędzie symbolem, a X równomiernie rozmieszczoną zmienną losową Σ'. Prawdopodobieństwo uzyskania tego symbolu P(X = α)oraz jego zawartości informacyjnej I(α)są określone przez:
P (X = α) = 1 / | Σ '| = 1/27
I (α) = -log₂ [P (X = α)] = -log₂ (1/27) = log₂ (27)
Dla słowa ω ∈ Σ*i jego ⊥-zakończonego odpowiednika ω' := ω · ⊥ ∈ (Σ')*mamy
I (ω): = I (ω ') = | ω' | * log₂ (27) = (| ω | + 1) * log₂ (27)
Ponieważ Generator liczb pseudolosowych (PRNG) jest inicjowany za pomocą 32-bitowego materiału źródłowego, możemy spodziewać się większości słów o długości do
λ = piętro [32 / log₂ (27)] - 1 = 5
do wygenerowania przez co najmniej jedno ziarno. Nawet gdybyśmy szukali słowa składającego się z 6 znaków, nadal odnosilibyśmy sukces przez około 41,06% czasu. Nieźle.
W przypadku 7 liter przyglądamy się bliżej 1,52%, ale nie zdawałem sobie z tego sprawy, zanim spróbowałem:
#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;
}
}
Zobacz wynik: http://ideone.com/JRGb3l