Cách công cụ tung xu hoạt động: ngẫu nhiên và công bằng
Công cụ lấy số ngẫu nhiên mật mã từ trình duyệt (crypto.getRandomValues), quyết định sấp hay ngửa trước khi hoạt cảnh chạy, mỗi xu độc lập với xác suất đúng 50%, lịch sử chỉ lưu trên thiết bị. Bài mô tả từng bước, bảng trình tự và cách tự kiểm tra bằng mô phỏng.
Tóm tắt nhanh
- Nguồn ngẫu nhiên:
crypto.getRandomValues, bộ sinh số mật mã của trình duyệt. - Kết quả được quyết định trước; hoạt cảnh chỉ trình diễn, không đổi được kết quả.
- Mỗi đồng xu là một số riêng, nên các xu độc lập; xác suất mỗi mặt đúng 50%.
- Lịch sử và cài đặt chỉ lưu trên thiết bị của bạn; máy chủ không nhận kết quả.
- Tự kiểm tra bằng mô phỏng 100.000 lượt ngay trong công cụ.

Nguồn ngẫu nhiên
Mỗi lần tung, mã JavaScript chạy trên trình duyệt của bạn gọi crypto.getRandomValues để lấy một số nguyên 32 bit. Hàm này lấy entropy từ hệ điều hành, cùng nguồn dùng để tạo khoá mã hoá.
Khác với Math.random, nguồn này không thể suy ra số tiếp theo từ các số trước. Đây là lý do công cụ chọn nó dù tung đồng xu không phải ứng dụng bảo mật.
Từ số ngẫu nhiên đến sấp hay ngửa
Số 32 bit có 4.294.967.296 giá trị. Với hai mặt, số chẵn là ngửa, số lẻ là sấp: mỗi bên đúng một nửa. Với các phép chọn khác (ví dụ chọn 1 trong 3), công cụ dùng phép lấy dư có loại bỏ để tránh thiên lệch modulo.
| Chọn trong | 4.294.967.296 chia hết? | Nếu lấy dư thẳng | Cách công cụ làm |
|---|---|---|---|
| 2 mặt | Có | Đều 50% | Lấy dư thẳng |
| 3 lựa chọn | Không (dư 1) | Lựa chọn đầu nhỉnh hơn 1/4 tỷ lần | Bỏ 1 giá trị cuối rồi mới lấy dư |
Với nhiều đồng xu, mỗi xu lấy một số riêng. Không có xu nào “biết” xu khác ra mặt gì, nên 3 đồng xu cho đúng 8 tổ hợp đồng khả năng.
Kết quả trước, hoạt cảnh sau
| Thời điểm | Việc xảy ra |
|---|---|
| 0 ms | Bạn nhấn nút. Kết quả được lấy ngay từ nguồn ngẫu nhiên và ghi vào bộ nhớ. |
| 0–140 ms | Đồng xu nhún xuống (anticipation). |
| 140–1.080 ms | Xu bay lên, xoay 4–5 vòng, rơi xuống. Góc dừng được tính từ kết quả đã có. |
| 1.080 ms | Chạm bàn: rung nhẹ, tia lửa, âm thanh nếu bật. |
| ≈1.450 ms | Kết quả hiện ra và được đọc cho trình đọc màn hình. |
Vì kết quả có trước, việc bấm nhanh, đổi tốc độ, tắt hiệu ứng, giảm chuyển động hay chuyển tab đều không đổi mặt xu. Nếu hoạt cảnh lỗi, công cụ vẫn hiển thị đúng kết quả đã chọn.
Tự kiểm tra bằng mô phỏng
Mở nút ☰ trên trang chủ và chọn tung 10.000 hoặc 100.000 lượt. Bạn sẽ thấy tỉ lệ ngửa tiến gần 50% và phân phối số mặt ngửa mỗi lượt khớp phân phối nhị thức.
Đây là thử nghiệm thống kê để tự quan sát, không phải chứng nhận độc lập. Lệch vài phần mười phần trăm ở 10.000 lượt là bình thường; lệch vài phần trăm ở 100.000 lượt mới đáng nghi. Công thức ở bài xác suất tung đồng xu.
Đồng xu số và đồng xu thật
| Tiêu chí | Đồng xu thật | tungdongxu.com |
|---|---|---|
| Xác suất mỗi mặt | ≈50%, lệch nhẹ về mặt xuất phát khi bắt bằng tay (≈51%) | 50% đúng |
| Ai có thể can thiệp | Người tung, người bắt | Không ai; kết quả sinh trên máy bạn |
| Lịch sử | Phải tự ghi | Tự lưu trên thiết bị |
| Nhiều xu, nhiều lượt | Chậm | Tức thì, tới 100.000 lượt |
| Cần gì | Đồng xu | Trình duyệt có JavaScript |
Dữ liệu lưu ở đâu?
Lịch sử, thống kê, chế độ, nhãn và cài đặt nằm trong localStorage của trình duyệt bạn. Máy chủ không nhận kết quả tung và không có tài khoản. Xoá dữ liệu trang web trong trình duyệt là xoá sạch. Chi tiết ở chính sách riêng tư.
Giới hạn
- Trình duyệt rất cũ không có
crypto.getRandomValuessẽ dùngMath.random: vẫn xấp xỉ 50/50 nhưng không có bảo đảm mật mã. - Tắt JavaScript: chỉ tung được một đồng xu bằng máy chủ (hàm
random_intcủa PHP), không có các chế độ khác. - Công cụ không dành cho cá cược và không phải thiết bị được kiểm định.
Câu hỏi thường gặp
Tại sao tôi tung 10 lần ra 7 ngửa?
Xác suất được 7 ngửa trong 10 lần là 11,7%, tức khoảng một lần trong chín phiên. Chỉ 24,6% phiên ra đúng 5 ngửa.
Trang có lưu kết quả để “cân bằng” về sau không?
Không. Mỗi lượt độc lập, không có bộ nhớ hay cơ chế bù trừ.
Mã nguồn có công khai không?
Phần sinh số và ánh xạ rất ngắn và được mô tả đầy đủ ở trên. Nếu bạn cần đối chiếu mã đang chạy, gửi yêu cầu qua form góp ý.
Nguồn tham khảo
- MDN Web Docs: Crypto.getRandomValues().
- Diaconis P., Holmes S., Montgomery R. (2007). Dynamical Bias in the Coin Toss. SIAM Review 49(2).
- Bartoš F. và cộng sự (2023). Fair coins tend to land on the same side they started. arXiv:2310.04153.