Все здесь проделали огромную работу, объяснив, как работает код, и продемонстрировали, как вы можете создать свои собственные примеры, но вот информационный теоретический ответ, показывающий, почему мы можем разумно ожидать, что существует решение, которое в конечном итоге найдет поиск методом перебора.
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