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