Semua orang di sini melakukan pekerjaan yang luar biasa untuk menjelaskan cara kerja kode dan menunjukkan bagaimana Anda dapat membangun contoh Anda sendiri, tetapi inilah jawaban teoretis informasi yang menunjukkan mengapa kita dapat mengharapkan solusi yang ada sehingga pencarian brute force pada akhirnya akan ditemukan.
26 huruf kecil yang berbeda membentuk alfabet kami Σ
. Untuk memungkinkan menghasilkan kata dengan panjang yang berbeda, kami selanjutnya menambahkan simbol terminator ⊥
untuk menghasilkan alfabet yang diperluasΣ' := Σ ∪ {⊥}
.
Membiarkan α
menjadi simbol dan X variabel acak terdistribusi secara seragam berakhir Σ'
. Peluang untuk memperoleh simbol itu P(X = α)
, dan konten informasinya I(α)
, diberikan oleh:
P (X = α) = 1 / | Σ '| = 1/27
I (α) = -log₂ [P (X = α)] = -log₂ (1/27) = log₂ (27)
Untuk satu kata ω ∈ Σ*
dan ⊥-
mitra yang diberhentikan ω' := ω · ⊥ ∈ (Σ')*
, kami punya
I (ω): = I (ω ') = | ω' | * log₂ (27) = (| ω | + 1) * log₂ (27)
Karena Pseudorandom Number Generator (PRNG) diinisialisasi dengan seed 32-bit, kita dapat mengharapkan sebagian besar kata panjang hingga
λ = lantai [32 / log₂ (27)] - 1 = 5
untuk dihasilkan oleh setidaknya satu biji. Bahkan jika kita mencari kata 6-karakter, kita masih akan berhasil sekitar 41,06% dari waktu. Tidak terlalu buruk.
Untuk 7 huruf kami melihat mendekati 1,52%, tetapi saya tidak menyadarinya sebelum mencobanya:
#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;
}
}
Lihat hasilnya: http://ideone.com/JRGb3l