Bạn cần một cách nhanh chóng và công bằng để có được một số ngẫu nhiên? Trình tạo số ngẫu nhiên trực tuyến miễn phí này tạo ra một số — hoặc cả một danh sách số — trong bất kỳ phạm vi nào bạn chọn, từ phạm vi đơn giản 1 đến 10 cho đến những phạm vi lên đến hàng tỷ. Đặt giá trị tối thiểu và tối đa vào “Tối thiểu” và “Tối đa”, chọn số lượng số bạn cần với “Số lượng mục chọn”, rồi nhấn “Tạo”. Cả hai giới hạn đều được tính vào kết quả, vì vậy phạm vi từ 1 đến 10 có thể cho ra cả 1 và 10.
Mỗi kết quả được tạo trực tiếp trong trình duyệt của bạn bằng Web Crypto API (crypto.getRandomValues) — công cụ này cung cấp các giá trị ngẫu nhiên an toàn về mặt mật mã học từ nguồn ngẫu nhiên của hệ điều hành. Không có gì được gửi đến máy chủ, không có gì được ghi lại trên máy chủ, và chúng tôi không bao giờ nhìn thấy các số của bạn. Việc tạo diễn ra tức thì, riêng tư, và vẫn hoạt động ngay cả khi kết nối chậm sau khi trang đã tải xong.
Các tùy chọn này được thiết kế cho những tình huống thực tế khi mọi người cần đến số ngẫu nhiên. Bật “Không lặp lại” để đảm bảo không có số nào xuất hiện hai lần — thiết lập bạn cần cho các buổi rút thăm, quay số kiểu xổ số, hoặc chia người vào các nhóm mà không lặp lại. Cần 20 người thắng trong số 500 người tham gia? Đặt “Tối thiểu” thành 1 và “Tối đa” thành 500, bật “Không lặp lại”, đặt “Số lượng mục chọn” thành 20, rồi nhấn “Tạo”. “Thứ tự sắp xếp” sắp xếp kết quả theo thứ tự tăng dần hoặc giảm dần, và một nút sao chép toàn bộ kết quả cùng lúc. Việc chuyển “Định dạng kết quả” từ “Dòng mới” sang “Phân cách bằng khoảng trắng” hoặc “Phân cách bằng dấu phẩy” sẽ hiển thị “Số lượng bộ”: tạo nhiều lần rút thăm độc lập cùng lúc — ví dụ hai mươi bộ, mỗi bộ 3 số, cho hai mươi vòng rút thăm — và “Cho phép trùng lặp giữa các bộ” quyết định liệu cùng một số có thể xuất hiện trong nhiều hơn một bộ hay không.
Tính ngẫu nhiên này thực sự được tạo ra như thế nào? Trình duyệt của bạn cung cấp các giá trị ngẫu nhiên an toàn về mặt mật mã học thông qua Web Crypto API, thay vì thông qua một PRNG JavaScript như Math.random(). Khi bạn nhấn “Tạo”, trang sẽ yêu cầu các giá trị ngẫu nhiên bằng crypto.getRandomValues và dùng chúng để tạo ra các số trong phạm vi bạn đã chọn. Nguồn tính ngẫu nhiên cơ bản này do trình duyệt và hệ điều hành cung cấp, nên trang không cần phải lưu giữ seed (giá trị khởi tạo) hay chuỗi giả ngẫu nhiên của riêng nó.
Việc ánh xạ một giá trị thô vào phạm vi của bạn thường là bước mà các trình tạo âm thầm mắc lỗi, và điều này đáng để nói riêng thành một đoạn. Lấy giá trị modulo với kích thước phạm vi có vẻ là cách đơn giản nhất, nhưng đó cũng chính là cách gây thiên lệch: trừ khi phạm vi chia hết đều cho 2^32, các số nhỏ nhất sẽ xuất hiện thường xuyên hơn một chút so với những số còn lại. Lỗi này được gọi là modulo bias, và nó có thể đo lường được chứ không chỉ là lý thuyết. Thay vào đó, trình tạo này loại bỏ bất kỳ giá trị nào vượt quá bội số chẵn lớn nhất của phạm vi và lấy một giá trị mới — kỹ thuật này được gọi là rejection sampling. Cách này cần thêm vài lần thử, nhưng đổi lại là một đảm bảo chính xác: mỗi số giữa “Tối thiểu” và “Tối đa” có xác suất hoàn toàn bằng nhau, chứ không chỉ gần bằng nhau.
Điều gì khiến một số thực sự ngẫu nhiên? Một số đủ ngẫu nhiên khi các kết quả trước đó không cho biết gì về kết quả tiếp theo — và trên thực tế có ba mức độ cho điều này. Một hàm giả ngẫu nhiên thông thường như Math.random() chạy một thuật toán tất định (deterministic): bất kỳ ai biết được trạng thái nội bộ của nó đều có thể tạo lại toàn bộ chuỗi — điều này ổn cho việc xáo trộn các trang trình chiếu, nhưng không phù hợp cho bất cứ điều gì mà kết quả không được phép đoán trước. Trình tạo an toàn về mặt mật mã học — mức độ mà công cụ này sử dụng — cũng là một thuật toán, nhưng được thiết kế để tạo ra các giá trị không thể đoán trước bằng cách sử dụng một nguồn tính ngẫu nhiên an toàn của hệ thống, và được thiết kế để khiến việc dự đoán giá trị tiếp theo là không khả thi trong thực tế. Tính ngẫu nhiên vật lý, từ các nguồn như nhiễu khí quyển hay phân rã phóng xạ, là một dạng khác với hai mức trên, mặc dù đối với việc lấy một số trong một phạm vi, sự khác biệt thực tế gần như biến mất. Đây chính là lý do tại sao các trình duyệt cung cấp một crypto API riêng thay vì cải tiến Math.random(): cả hai giải quyết những vấn đề khác nhau, và chỉ một trong hai là an toàn khi kết quả thực sự quan trọng đối với ai đó.
Một chuỗi thực sự ngẫu nhiên không được tạo ra để trông có vẻ ngẫu nhiên trong mắt con người. Lấy mười số trong khoảng từ 1 đến 10, và bạn sẽ thường xuyên thấy một số lặp lại, một cặp gần nhau như 7, 7, 8, hoặc một chuỗi ngắn các số lớn liên tiếp — và tất cả những điều đó đều bình thường. Tính ngẫu nhiên thực sự là không thể đoán trước, chứ không phải phân bố đều: mỗi lần rút thăm đều độc lập, các số trước đó hoàn toàn không ảnh hưởng đến các số sau, và không có số nào từng “đến lượt”. Bản năng khăng khăng điều ngược lại được gọi là ngụy biện con bạc (gambler's fallacy), và cũng chính bản năng đó khiến con người trở thành những trình tạo số ngẫu nhiên tệ — khi được yêu cầu tự nghĩ ra một chuỗi ngẫu nhiên, chúng ta tránh lặp lại và trải đều các giá trị hơn nhiều so với những gì xác suất thực sự làm. Kết quả trông gọn gàng đến đáng ngờ thường mang đậm dấu ấn của con người; tính ngẫu nhiên thực sự lại tạo ra các cụm.
Tại sao nên chọn trình tạo số ngẫu nhiên này?
- Chỉ tạo trong trình duyệt: các số được tạo trên thiết bị của bạn và không bao giờ được gửi đi bất cứ đâu
- Tính ngẫu nhiên qua Web Crypto API: an toàn về mặt mật mã học, không phải Math.random()
- Không có modulo bias: rejection sampling giữ cho mọi số trong phạm vi có xác suất bằng nhau
- Bất kỳ phạm vi nào: từ 1 đến 10 cho đến các giá trị lên đến hàng tỷ, bao gồm cả hai giới hạn
- Chế độ “Không lặp lại”: tạo danh sách không trùng lặp cho các buổi rút thăm và chia nhóm
- Nhiều bộ: tạo nhiều lần rút thăm độc lập chỉ trong một cú nhấp
- Sắp xếp và định dạng kết quả: tăng dần hoặc giảm dần, dòng mới, khoảng trắng, hoặc dấu phẩy
- Lịch sử và lưu vào tệp: giữ lại bản ghi của một lần rút thăm mà bạn có thể cần giải trình
- Không giới hạn và miễn phí: không cần đăng ký, không giới hạn sử dụng, không có gì được lưu trên máy chủ của chúng tôi
Số ngẫu nhiên xuất hiện ở nhiều nơi hơn hầu hết mọi người nghĩ. Giáo viên gọi học sinh trả lời mà không thiên vị. Streamer và các đội marketing rút thăm người thắng quà tặng và rút thăm trước khán giả — những người cần tin vào kết quả. Người chơi thay thế xúc xắc bị mất hoặc quyết định ai chơi trước, và các giải đấu rút thăm thứ tự xuất phát. Các nhà nghiên cứu chọn một mẫu ngẫu nhiên để kết quả nghiên cứu của họ áp dụng được rộng hơn ngoài những người tình nguyện tham gia. Nhà phát triển tạo dữ liệu thử nghiệm, thiết lập seed cho các mô phỏng, và chọn định danh trong quá trình QA. Điểm chung của tất cả những điều này là một quy trình lựa chọn ngẫu nhiên có thể giải thích được sau đó: vì việc rút thăm sử dụng tính ngẫu nhiên mật mã học và diễn ra hoàn toàn trên thiết bị của bạn, bạn có thể giải thích và ghi lại cách thức quy trình lựa chọn diễn ra nếu có ai đó đặt câu hỏi.
Trình tạo này có một số giới hạn thực tế cần biết. Chế độ “Không lặp lại” không thể tạo ra nhiều số hơn số lượng có trong phạm vi: 20 giá trị duy nhất trong khoảng từ 1 đến 10 vốn dĩ không tồn tại. Các lần rút thăm đều độc lập và kết quả trước đó không ảnh hưởng đến kết quả sau, vì vậy việc tải lại trang không đặt lại bất kỳ chu kỳ nào — bởi vì ở đây không hề có chu kỳ. Và mặc dù các số được tạo bằng tính ngẫu nhiên an toàn về mặt mật mã học, việc rút thăm ở đây là một lựa chọn công bằng, chứ không phải một dự đoán: các đợt quay số xổ số chính thức sử dụng thiết bị vật lý hoặc được chứng nhận riêng của họ, và bất cứ điều gì được tính toán trong trình duyệt của bạn đều không có liên hệ gì với chúng. Trong phạm vi những giới hạn đó, sự đảm bảo là rất chắc chắn — mỗi số trong phạm vi của bạn có xác suất hoàn toàn bằng nhau, ở mỗi lần rút thăm.