Buradaki herkes, kodun nasıl çalıştığını açıklamak ve kendi örneklerinizi nasıl oluşturabileceğinizi göstermek için harika bir iş çıkardı, ancak işte kaba kuvvet aramasının nihayetinde bulacağını bir çözümün var olmasını neden makul bir şekilde beklediğimizi gösteren bir bilgi teorik cevabı.
26 farklı küçük harf alfabemizi oluşturur Σ
. Farklı uzunluklarda kelimeler üretilmesine izin vermek için, ⊥
genişletilmiş bir alfabe elde etmek için bir sonlandırıcı sembolü ekliyoruz Σ' := Σ ∪ {⊥}
.
Izin α
vermek bir sembol ve X eşit dağılmış rastgele değişken üzerinde Σ'
. Bu simgeyi elde etme olasılığı P(X = α)
ve bilgi içeriği I(α)
aşağıdakiler tarafından verilir:
P (X = α) = 1 / | Σ '| = 1/27
I (α) = -log₂ [P (X = α)] = -log₂ (1/27) = log₂ (27)
Bir kelime ω ∈ Σ*
ve ⊥-
sonlandırılan karşılığı için ω' := ω · ⊥ ∈ (Σ')*
,
I (ω): = I (ω ') = | ω' | * log₂ (27) = (| ω | + 1) * log₂ (27)
Pseudorandom Number Generator (PRNG) 32 bitlik bir tohumla başlatıldığından, çoğu uzun kelimeyi
λ = kat [32 / log₂ (27)] - 1 = 5
en az bir tohum tarafından üretilir. 6 karakterlik bir kelime arayacak olsak bile, zamanın yaklaşık% 41.06'sında başarılı olurduk. O kadar da eski püskü değil.
7 harf için% 1.52'ye daha yakından bakıyoruz, ancak denemeden önce bunu fark etmemiştim:
#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;
}
}
Çıktıya bakın: http://ideone.com/JRGb3l