Mọi người ở đây đã làm rất tốt khi giải thích cách mã hoạt động và chỉ ra cách bạn có thể xây dựng các ví dụ của riêng mình, nhưng đây là một câu trả lời lý thuyết thông tin cho thấy lý do tại sao chúng ta có thể mong đợi một giải pháp tồn tại mà tìm kiếm vũ phu cuối cùng sẽ tìm thấy.
26 chữ cái viết thường khác nhau tạo thành bảng chữ cái của chúng tôi Σ
. Để cho phép tạo ra các từ có độ dài khác nhau, chúng tôi thêm một biểu tượng dấu kết thúc ⊥
để tạo ra một bảng chữ cái mở rộng Σ' := Σ ∪ {⊥}
.
Đặt α
một ký hiệu và X một biến ngẫu nhiên phân bố đồng đều trên Σ'
. Xác suất có được biểu tượng đó P(X = α)
và nội dung thông tin của nó I(α)
được đưa ra bởi:
P (X = α) = 1 / | Σ '| = 1/27
I (α) = -log₂ [P (X = α)] = -log₂ (1/27) = log₂ (27)
Đối với một từ ω ∈ Σ*
và ⊥-
đối tác chấm dứt của nó ω' := ω · ⊥ ∈ (Σ')*
, chúng tôi có
Tôi (ω): = Tôi (ω ') = | ω' | * log (27) = (| ω | + 1) * log₂ (27)
Do Trình tạo số giả ngẫu nhiên (PRNG) được khởi tạo với hạt giống 32 bit, chúng tôi có thể mong đợi hầu hết các từ có độ dài lên đến
= sàn [32 / log₂ (27)] - 1 = 5
được tạo ra bởi ít nhất một hạt giống. Ngay cả khi chúng tôi tìm kiếm một từ có 6 ký tự, chúng tôi vẫn sẽ thành công khoảng 41,06% thời gian. Không quá xấu.
Trong 7 chữ cái, chúng tôi đang tìm kiếm gần 1,52%, nhưng tôi đã nhận ra điều đó trước khi thử:
#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;
}
}
Xem đầu ra: http://ideone.com/JRGb3l