Tạo số ngẫu nhiên
Chọn khoảng, chọn số lượng, bấm tạo. Mỗi số lấy từ bộ sinh số mã hoá của trình duyệt — hoặc từ một seed bạn tự đặt, nếu bạn cần lấy lại đúng kết quả cũ.
Thống kê của lần tạo này
Cách tính
Một khoảng số không phải là một đoạn liên tục mà là một tập hữu hạn các giá trị có thể ra. Khoảng 1–45 có 45 giá trị; khoảng 0–1 với hai chữ số thập phân có 101 giá trị, vì cả 0 và 1 đều nằm trong đó. Trang này rút một trong những giá trị ấy, chứ không lấy một số thực rồi làm tròn — làm tròn ở bước cuối khiến hai đầu mút chỉ có một nửa cơ hội so với mọi giá trị ở giữa, và đó là lỗi im lặng phổ biến nhất của các bộ tạo số ngẫu nhiên.
Số ngẫu nhiên lấy từ crypto.getRandomValues của trình duyệt, không dùng Math.random. Math.random là bộ sinh giả ngẫu nhiên gieo từ đồng hồ hệ thống: kết quả trông ngẫu nhiên, nhưng người biết nó chạy vào khoảng thời gian nào có thể thu hẹp không gian kết quả. Với một lần quay số trúng thưởng, đó là khác biệt giữa "không ai đoán được" và "người tổ chức đoán được".
Việc quy một số ngẫu nhiên 32 bit về khoảng cần lấy cũng không đơn giản là chia lấy dư. Phép chia dư lệch: khi 2³² không chia hết cho kích thước khoảng, những giá trị ở đầu khoảng xuất hiện nhiều hơn phần còn lại. Trang này loại bỏ những giá trị rơi ngoài bội số chia hết lớn nhất rồi rút lại, nên mọi số trong khoảng có xác suất bằng nhau.
Tuỳ chọn "không lấy trùng" không phải là rút lại mỗi khi gặp số trùng. Cách đó ổn khi lấy 6 số trong 45, nhưng chậm dần đến mức tệ khi lấy 90 số trong 100 — mà đó đúng là lúc người ta cần nó nhất. Ở đây nó là một phép xáo Fisher-Yates chỉ thực hiện đúng số bước cần thiết, nên lấy 900 số trong 1.000 cũng nhanh như lấy 1 số, và mọi hoán vị vẫn có xác suất bằng nhau.
Ô seed đổi nguồn ngẫu nhiên sang một bộ sinh tất định gieo từ đoạn văn bản bạn nhập. Cùng một seed với cùng cấu hình luôn cho ra đúng dãy số đó, trên mọi máy và mọi thời điểm — đó là cách biến một kết quả ngẫu nhiên thành thứ người khác kiểm chứng lại được. Đổi lại, kết quả có seed thì đoán được nếu biết seed, nên đừng dùng nó để sinh bất cứ thứ gì cần bí mật.
Công thức
số giá trị có thể ra = (đến − từ) × 10^(số chữ số thập phân) + 1
Cộng 1 vì cả hai đầu mút đều nằm trong khoảng. Khoảng 1–6 có 6 giá trị chứ không phải 5, và đó là lý do một con xúc xắc có 6 mặt.
Ví dụ
Bốc thăm 6 số trong 45, không trùng:
- Số giá trị có thể ra
- (45 − 1) × 1 + 1 = 45
- Số bộ 6 số khác nhau
- C(45,6) = 8.145.060
- Xác suất trúng một bộ cụ thể
- 1 / 8.145.060
- Số bước xáo thực hiện
- 6 (không phải 45)
Đặt thêm một seed, chẳng hạn tên buổi bốc thăm kèm ngày, thì bất kỳ ai mở lại trang với đúng cấu hình ấy cũng nhận được đúng 6 số này — bằng chứng rằng kết quả không bị sửa sau khi đã công bố.
Câu hỏi thường gặp
Số ở đây có thật sự ngẫu nhiên không?
Khi ô seed để trống thì có: nguồn là crypto.getRandomValues, cùng nguồn mà trình duyệt dùng để sinh khoá mã hoá, và không ai đoán trước được. Khi bạn nhập seed thì kết quả là tất định — vẫn phân bố đều, nhưng ai biết seed cũng tính lại được. Đó là điều bạn chủ động đổi lấy khả năng kiểm chứng.
Seed dùng để làm gì?
Để người khác lấy lại đúng kết quả của bạn. Công bố seed và cấu hình trước khi quay, rồi ai cũng có thể tự chạy lại và thấy ra đúng dãy số đó — không cần tin bạn. Nút "Chia sẻ cấu hình" tạo sẵn liên kết mang theo cả khoảng, số lượng và seed.
Hai đầu mút có nằm trong khoảng không?
Có. Khoảng 1–10 rút ra được cả 1 lẫn 10, mỗi số đúng 1/10 cơ hội như tám số còn lại. Ô "Số giá trị có thể ra" trong phần thống kê là cách kiểm tra nhanh: 1–10 phải hiện 10, không phải 9.
Lấy được nhiều nhất bao nhiêu số một lần?
1.000 số mỗi lần tạo, trong khoảng từ −1.000.000.000 đến 1.000.000.000. Nếu bật "không lấy trùng" mà khoảng không đủ số khác nhau, số lượng sẽ tự giảm xuống bằng số giá trị có thể ra và trang báo lại cho bạn thay vì lặng lẽ trả về ít hơn.
Vì sao số thập phân bị giảm bớt chữ số?
Vì khoảng quá rộng so với độ chính xác yêu cầu. Khoảng rộng một tỷ với sáu chữ số thập phân là 10¹⁵ giá trị khác nhau, nhiều hơn mức bộ rút số này địa chỉ hoá được. Khoảng là thứ bạn yêu cầu nên nó được giữ nguyên; phần thập phân là thứ được giảm, và trang nói rõ khi điều đó xảy ra.
Vì sao kết quả sao chép ra dùng dấu chấm thập phân?
Vì dãy số đó thường được dán vào bảng tính, tin nhắn hay đoạn mã, và "1.234,5" bị mọi thứ vừa kể đọc thành một thứ khác. Phần hiển thị trên trang và phần sao chép đều dùng dấu chấm, không có dấu phân cách hàng nghìn, để dán đi đâu cũng ra đúng con số.
Tôi dùng trang này để sinh mật khẩu hay mã OTP được không?
Không nên. Khi để trống seed thì nguồn đủ mạnh, nhưng một dãy chữ số vẫn là mật khẩu yếu, và một mã có seed thì bất kỳ ai biết seed cũng sinh lại được. Cần mật khẩu thì dùng trang tạo mật khẩu — nó có cả bảng ký tự đầy đủ lẫn số bit entropy để bạn biết mình đang có gì.
Số có được gửi lên máy chủ không?
Không. Mọi thứ chạy trong trình duyệt của bạn. Lịch sử các lần tạo chỉ nằm trong bộ nhớ của trang — tải lại là mất, và không có gì được ghi vào máy bạn hay gửi đi đâu.