Thuật Toán Mô Phỏng Gieo Quẻ Kinh Dịch: CSPRNG, Markov Chain Và Entropy
Phân tích dưới góc nhìn Khoa học Máy tính
Bài viết này phân tích chi tiết các thuật toán đằng sau việc mô phỏng gieo quẻ Kinh Dịch trên máy tính — từ nguồn entropy, phân phối xác suất đến mô hình Markov Chain.
1. Tại Sao Không Dùng Math.random()?
Math.random() trong JavaScript sử dụng thuật toán Xorshift128+ — là PRNG (Pseudo-Random Number Generator), có thể đoán trước nếu biết seed. Đối với ứng dụng bói dịch, người dùng kỳ vọng tính ngẫu nhiên thực sự, nên cần CSPRNG.
Giải pháp: crypto.getRandomValues() (Web Crypto API)
// Sinh 1 byte ngẫu nhiên mật mã học
const buf = new Uint8Array(1);
crypto.getRandomValues(buf);
const coinFlip = buf[0] % 2; // 0 hoặc 1
2. Mô Phỏng Ba Đồng Xu — Binomial Distribution
Gieo 3 đồng xu, mỗi đồng xu ngửa (3) hoặc sấp (2). Tổng ∈ {6, 7, 8, 9}. Đây là phân phối nhị thức B(3, 0.5) dịch chuyển.
function throwThreeCoins() {
const bytes = new Uint8Array(3);
crypto.getRandomValues(bytes);
let sum = 0;
for (let i = 0; i < 3; i++) {
sum += (bytes[i] % 2 === 0) ? 3 : 2; // ngửa=3, sấp=2
}
return sum; // 6, 7, 8, hoặc 9
}
Phân phối: P(6)=1/8, P(7)=3/8, P(8)=3/8, P(9)=1/8 — tổng entropy = 1.81 bit/hào.
3. Cỏ Thi — Markov Chain Với Trạng Thái Ẩn
Phương pháp Cỏ Thi (蓍草) gồm 18 bước (3 biến × 6 hào). Mỗi biến (變) tạo dư số phụ thuộc vào kết quả biến trước — đây chính là chuỗi Markov.
Thuật toán Đại diễn pháp (大衍法):
Bắt đầu với 49 cọng (bỏ 1 tượng Thái Cực)
Chia 2 nhóm ngẫu nhiên (Lưỡng Nghi — Thiên-Địa)
Rút 1 cọng từ nhóm phải (Tam Tài — Nhân)
Đếm nhóm trái theo nhóm 4, giữ dư (Tứ Tượng — bốn mùa)
Đếm nhóm phải theo nhóm 4, giữ dư
Tổng dư = 4 hoặc 8 → "biến" (一變)
Lặp 3 biến → 1 hào, 18 biến → 6 hào
Entropy của cỏ thi: ~1.87 bit/hào (thấp hơn đồng xu do phân phối lệch yin-biased).
4. Mai Hoa — Deterministic Hashing
Mai Hoa Dịch Số không sử dụng nguồn ngẫu nhiên mà dùng thời gian Can Chi hoặc số nhập vào làm input. Về bản chất, đây là hàm hash deterministic:
upperTrigram = (year + month + day) % 8
lowerTrigram = (year + month + day + hour) % 8
movingLine = (year + month + day + hour) % 6
Cùng thời điểm sẽ luôn cho cùng quẻ — đây là đặc tính, không phải bug. Thiệu Ung tin rằng "cảm ứng" (感應) nằm ở thời điểm khởi ý hỏi.
5. So Sánh Thuật Toán
| Phương pháp | Kiểu thuật toán | Entropy/hào | Độ phức tạp |
|---|---|---|---|
| Ba đồng xu | Binomial B(3,0.5) | 1.81 bit | O(3) per hào |
| Cỏ thi | Markov Chain | 1.87 bit | O(18) per hào |
| Mai Hoa giờ | Deterministic hash | 0 bit | O(1) |
| Mai Hoa số | Deterministic hash | 0 bit | O(1) |
| Nhập tay | User input | N/A | O(6) |
Kết luận
Việc mô phỏng Kinh Dịch trên máy tính đặt ra nhiều bài toán thú vị: từ nguồn entropy mật mã học, mô hình Markov, đến hàm hash deterministic. Mỗi phương pháp cổ đại đều có mô hình toán học tương ứng — chứng tỏ người xưa đã hiểu sâu về xác suất và tổ hợp dù chưa có ngôn ngữ hình thức.