ทุกคนที่นี่ทำงานได้อย่างยอดเยี่ยมในการอธิบายวิธีการทำงานของรหัสและการแสดงว่าคุณสามารถสร้างตัวอย่างของคุณเองได้อย่างไร แต่นี่คือคำตอบทางทฤษฎีที่แสดงข้อมูลว่าทำไมเราสามารถคาดหวังได้ว่า
26 Σ
ตัวอักษรกรณีที่ต่ำกว่าที่แตกต่างกันในรูปแบบตัวอักษรของเรา ในการอนุญาตให้สร้างคำของความยาวที่แตกต่างกันเรายังเพิ่มสัญลักษณ์ตัว Terminator ให้ผลผลิตขยายตัวอักษร⊥
Σ' := Σ ∪ {⊥}
อนุญาตα
เป็นสัญลักษณ์และ 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)
เนื่องจาก Pseudorandom Number Generator (PRNG) เริ่มต้นด้วยเมล็ดพันธุ์แบบ 32 บิตเราจึงสามารถคาดหวังคำที่มีความยาวสูงสุดได้
λ = floor [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