Cách Doxucxac tạo kết quả ngẫu nhiên

Mỗi lượt đổ xúc xắc online trên Doxucxac đi qua ba bước: chọn kết quả bằng bộ sinh số ngẫu nhiên mật mã, mô phỏng vật lý để diễn lại cú ném, rồi hiển thị kết quả. Trang này giải thích từng bước và công bố kết quả tự kiểm định thống kê của chúng tôi, kèm mã để bạn tự chạy lại.

1. Kết quả được chọn trước, bằng bộ sinh số mật mã

Kết quả của mỗi lượt đổ được chọn bằng crypto.getRandomValues() — bộ sinh số ngẫu nhiên an toàn mật mã (CSPRNG) có sẵn trong trình duyệt, cùng loại dùng để tạo khoá bảo mật. Math.random() chỉ được dùng cho phần trình diễn như âm thanh, hiệu ứng hay tư thế ban đầu của xúc xắc, không bao giờ dùng để quyết định mặt ngửa.

Một số 32-bit có 4.294.967.296 giá trị — con số không chia hết cho 6, 10 hay 20. Nếu chỉ lấy phần dư, vài mặt sẽ nhỉnh hơn các mặt khác một chút (gọi là modulo bias). Doxucxac loại bỏ sai lệch này bằng rejection sampling: số nào rơi vào phần dư thừa ở cuối dải sẽ bị bỏ để lấy số mới. Đây là toàn bộ hàm chọn mặt đang chạy trên website:

const buf = new Uint32Array(1);

function randInt(n) {
  const limit = Math.floor(0x100000000 / n) * n;
  let x;
  do {
    crypto.getRandomValues(buf);
    x = buf[0];
  } while (x >= limit);
  return 1 + (x % n);
}

Mỗi viên xúc xắc trong một lượt được gọi hàm này độc lập. Kết quả được chọn trước khi xúc xắc rời tay.

2. Vật lý 3D chỉ diễn lại kết quả

Ở chế độ hiệu ứng Cao, cú ném được mô phỏng bằng thư viện vật lý cannon-es: xúc xắc có khối lượng, va vào thành khay, va vào nhau rồi dừng lại. Sau khi mô phỏng xong, chúng tôi xoay nhãn của từng viên theo một phép đối xứng của chính khối đó, để mặt ngửa lên mang đúng giá trị đã chọn ở bước 1. Hình dạng, quỹ đạo và tiếng va chạm không thay đổi.

Vì vậy xác suất hoàn toàn do bước 1 quyết định — không phụ thuộc lực ném, góc ném, tốc độ máy hay việc bạn giữ nút Đổ lâu bao nhiêu khi gieo xúc xắc. Chế độ Thấp (xúc xắc CSS, không dùng vật lý) gọi cùng một hàm chọn mặt.

3. Kết quả tự kiểm định

Ngày 01/10/2026, chúng tôi chạy hàm randInt ở trên trong Node.js v22.23.2 và dùng kiểm định chi bình phương (χ²) để so với phân phối lý thuyết: một triệu lượt D6, một triệu lượt D20, và một triệu ván ba viên D6 (ba triệu lần gọi hàm) để thống kê tổng điểm và tài xỉu. Giá trị p lớn hơn 0,05 nghĩa là không có bằng chứng thống kê cho thấy kết quả bị lệch.

Đây là tự kiểm định trên hàm chọn mặt, chưa phải kiểm định độc lập và không bao gồm phần hiển thị 3D. Bạn có thể tải script kiểm định (chạy bằng Node.js 20 trở lên) và số liệu gốc để tự chạy lại; mỗi lần chạy cho số khác nhau nhưng các kết luận phải tương tự.

Một viên D6 — 1.000.000 lượt

Lý thuyết: mỗi mặt 16,667%
Mặt Số lần Tỷ lệ
1 166.628 16,663%
2 166.621 16,662%
3 166.973 16,697%
4 166.942 16,694%
5 166.495 16,650%
6 166.341 16,634%

χ² = 1,85 với 5 bậc tự do, p = 0,87. Đây cũng là hàm tạo kết quả cho mỗi viên xúc xắc 6 mặt bạn đổ trên trang chủ.

Các phép thử khác

Mỗi phép thử 1.000.000 lượt hoặc ván
Phép thử Kết quả χ² (bậc tự do) p
Một viên D20 Mỗi mặt từ 4,948% đến 5,039% (lý thuyết 5%) 24,15 (19) 0,19
Tổng ba viên D6 16 giá trị tổng từ 3 đến 18 khớp tỷ lệ của 216 tổ hợp 11,80 (15) 0,69

Tài xỉu (luật Bộ ba)

1.000.000 ván, ba viên D6
Kết quả Đo được Lý thuyết
Tài (11–17) 48,695% 48,611%
Xỉu (4–10) 48,499% 48,611%
Bộ ba 2,805% 2,778%

Các chênh lệch dưới 0,12 điểm phần trăm nằm trong dao động tự nhiên của một triệu ván.

4. Điều kiểm định không chứng minh được

5. Tự quan sát trong ứng dụng

Mở Thống kê trong bảng cài đặt để xem tần suất các mặt của tối đa 100 lượt gần nhất với cùng cấu hình. Với cỡ mẫu nhỏ như vậy, các cột có thể còn chênh nhau đáng kể — đó là dao động bình thường với mọi viên xúc sắc, từ 3 đến 20 mặt. Muốn kiểm tra trên hàng triệu lượt, hãy dùng script ở mục 3. Nếu phát hiện điều bất thường, hãy báo cho chúng tôi.