Đua Vịt Peti 🔒 Thuật toán công bằng

Ngẫu nhiên · công bằng · kiểm chứng được

Không ai sắp xếp được kết quả, kể cả host hay admin

Mỗi cuộc đua được quyết định bởi một seed ngẫu nhiên. Mã băm SHA-256 của seed được công bố trước khi đua, seed được công bố sau khi đua. Ai cũng có thể chạy lại và ra đúng kết quả đó. Cách làm này gọi là provably fair.

  1. 1

    Tạo seed bí mật

    Trước mỗi lượt, máy tạo 32 byte ngẫu nhiên bằng crypto.getRandomValues (bộ sinh số ngẫu nhiên an toàn của hệ điều hành), viết thành 64 ký tự hex. Phòng đua: máy chủ tạo. Đua nhanh: chính trình duyệt của bạn tạo.

  2. 2

    Công bố mã cam kết

    Trên màn hình đua hiện 🔒 Mã cam kết = SHA-256(seed). Từ mã này không thể đoán ngược ra seed, nhưng seed đã bị “khóa”: đổi dù một ký tự thì mã cam kết sẽ khác hoàn toàn.

  3. 3

    Đua theo seed

    Seed khởi động bộ sinh số giả ngẫu nhiên sfc32. Cuộc đua chạy theo từng bước cố định 50 ms; tốc độ mọi nhân vật dao động theo cùng một luật, chỉ phụ thuộc vào dãy số này và thứ tự danh sách.

  4. 4

    Công bố seed

    Đua xong, seed được công bố cùng file kiểm chứng (.json). Bạn kiểm tra SHA-256(seed) đúng bằng mã cam kết đã thấy, rồi chạy lại cuộc đua: kết quả phải trùng từng vị trí.

Thử SHA-256 ngay tại đây

Gõ gì cũng được. Đổi một ký tự, cả mã băm đổi theo, và không có cách nào đi ngược từ mã băm về chữ ban đầu.

SHA-256…

Cùng seed → cùng dãy số

Đây đúng là mã nguồn trò chơi dùng. Bấm tạo seed mới hoặc dán một seed đã công bố: dãy số ngẫu nhiên luôn giống nhau trên mọi máy.

Mã cam kết = SHA-256(seed)…

5 số ngẫu nhiên đầu tiên (0 → 1)…

Câu hỏi thường gặp

Host có làm nhân vật nào chạy nhanh hơn được không?

Không. Host chỉ chọn map, danh sách và thời lượng. Tốc độ không có nút chỉnh nào; mọi nhân vật dùng chung một luật và chung một dãy số. Nếu host đổi seed sau khi mã cam kết đã hiện, mã sẽ không khớp và trang kiểm chứng báo sai ngay.

Chọn nhân vật hay phụ kiện có ảnh hưởng không?

Không. Nhân vật, phụ kiện, ném gạch, ném vỏ chuối, emoji… chỉ để vui, không đọc vào dãy số ngẫu nhiên. Không con nào có lợi thế sẵn.

Vì sao người dẫn đầu giữa chừng vẫn có thể thua?

Tốc độ mỗi bước dao động ngẫu nhiên, người bị bỏ xa được bám đuổi nhẹ, và đoạn nước rút cuối hoàn toàn ngẫu nhiên. Cuộc đua vì vậy hồi hộp tới vạch đích, nhưng vẫn chỉ do seed quyết định.

Thứ tự trong danh sách có quan trọng không?

Có, khi kiểm chứng: số ngẫu nhiên được chia cho tay đua theo đúng thứ tự danh sách, nên phải nhập đúng thứ tự (file .json đã ghi sẵn). Thứ tự được chốt trước khi đua, cùng lúc với mã cam kết.

“Có tay đua bị mời ra giữa chừng” nghĩa là gì?

Nếu host mời một người ra khỏi cuộc đua khi đang chạy, kết quả trên màn hình sẽ khác bản chạy lại. Trang kết quả ghi rõ cảnh báo này để mọi người biết.

Tôi có cần tin máy chủ không?

Không cần. Trang kiểm chứng chạy hoàn toàn trên trình duyệt của bạn bằng cùng mã nguồn với cuộc đua (fair.js, simulate.js), không gửi gì lên máy chủ.