Усі тут зробили чудову роботу, пояснивши, як працює код, та показавши, як можна сконструювати власні приклади, але ось інформаційно-теоретична відповідь, яка показує, чому ми можемо з розумом очікувати існування рішення, яке в результаті знайде груба сила пошуку.
26 різних малих літер утворюють наш алфавіт Σ
. Щоб дозволити генерувати слова різної довжини, ми додатково додаємо символ термінатора, ⊥
щоб отримати розширений алфавіт Σ' := Σ ∪ {⊥}
.
Нехай α
буде символом і X рівномірно розподілена випадкова величина по Σ'
. Імовірність отримання цього символу P(X = α)
та його інформаційного змісту I(α)
задаються:
P (X = α) = 1 / | Σ '| = 1/27
I (α) = -log₂ [P (X = α)] = -log₂ (1/27) = log₂ (27)
Слово ω ∈ Σ*
та його ⊥-
скасований аналог у ω' := ω · ⊥ ∈ (Σ')*
нас є
I (ω): = I (ω ') = | ω' | * log₂ (27) = (| ω | + 1) * log₂ (27)
Оскільки генератор псевдовипадкових чисел (PRNG) ініціалізований 32-бітовим насінням, ми можемо очікувати більшості слів довжиною до
λ = підлога [32 / log₂ (27)] - 1 = 5
бути породженим щонайменше одним насінням. Навіть якби ми шукали 6-символьне слово, ми все-таки мали б успіх приблизно 41,06% часу. Не надто пошарпаний.
Для 7 листів ми дивимось ближче до 1,52%, але я не зрозумів цього, перш ніж спробувати:
#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;
}
}
Дивіться вихід: http://ideone.com/JRGb3l