Tóm tắt nhanh: Dự án đang dùng 4 nguồn/loại random khác nhau.
- Ba PRNG tự cài (có seed)
- xorshift32(seed): PRNG 32-bit rất nhanh, chu kỳ ~2^32−1. Trả về số trong [0,1).
- mulberry32(seed): PRNG 32-bit đơn giản, phân phối khá ổn cho tác vụ game.
- splitmix32(seed): Biến thể 32-bit, trộn tốt, dùng cộng hằng và mix bit.
- Cách seed: lấy seed từ Date.now() rồi XOR với các hằng (0xABC123, 0x123456).
- Mục đích: quyết định quân X hay O khi người chơi mở ô (sym = gen() < 0.5 ? "X" : "O").
- Math.random (không seed, built-in)
- Dùng để: Chọn ngẫu nhiên 1 trong 3 PRNG ở mỗi lượt (rngs[Math.floor(Math.random()*rngs.length)]). Tạo hiệu ứng pháo hoa: vị trí nổ, vận tốc, góc bay, màu (hue), thời lượng sống, độ nhấp nháy, kích thước hạt, v.v. Các tiện ích rand(min,max) trong phần pháo hoa.
Lưu ý quan trọng
- Tất cả đều không phải CSPRNG (không dùng cho bảo mật).
- Vì còn dùng Math.random để chọn PRNG và cho hiệu ứng, kết quả không tái lập 100% theo seed. Nếu bạn muốn “phát lại” ván cờ y hệt, nên dùng duy nhất một PRNG có seed cho toàn bộ logic (kể cả chọn RNG) và log lại seed + chuỗi thao tác.