Bạn cần bốc thăm tìm người trúng thưởng, gọi một học sinh lên bảng, hay quyết định xem ai sẽ rửa bát? Công cụ chọn ngẫu nhiên trực tuyến miễn phí này sẽ lựa chọn một cách công bằng từ bất kỳ danh sách nào bạn dán vào. Hãy đặt các mục của bạn vào hộp “Mục” — mỗi mục trên một dòng, hoặc cách nhau bằng dấu phẩy — thiết lập số lượng bạn muốn qua “Số lượng mục chọn”, và nhấn “Tạo”. Một danh sách cần ít nhất hai mục và có thể chứa tối đa 1000 mục, mỗi mục dài tối đa 200 ký tự.
Mỗi lượt chọn được thực hiện trực tiếp trên trình duyệt của bạn bằng Web Crypto API (crypto.getRandomValues), cung cấp các giá trị ngẫu nhiên an toàn về mặt mật mã học từ hệ thống cốt lõi của trình duyệt. Danh sách của bạn không bao giờ bị gửi đến máy chủ, không bị ghi nhật ký và chúng tôi cũng không bao giờ nhìn thấy — điều này quan trọng ở đây hơn hầu hết các công cụ khác, bởi vì người dùng thường dán vào danh sách khách hàng, sổ điểm lớp, hoặc tên của đồng nghiệp. Nút “Tải từ tập tin” cũng giữ nguyên cam kết đó: trình duyệt của bạn tự đọc tập tin và điền vào hộp văn bản ngay trên máy, không có bất kỳ dữ liệu nào bị tải lên mạng.
Các tùy chọn được thiết kế cho những định dạng danh sách mà mọi người thực sự sử dụng. “Dấu phân cách mục” được đặt sẵn ở chế độ “Tự động phát hiện”, tự đọc các dấu ngắt dòng và dấu phẩy rồi nhận diện xem danh sách của bạn dùng loại nào, do đó một danh sách sao chép từ bảng tính, tin nhắn trò chuyện hoặc tài liệu sẽ hoạt động ngay mà không cần định dạng lại. Hãy khóa nó ở “Dòng mới”, “Dấu phẩy” hoặc “Khoảng trắng” khi dữ liệu của bạn lẫn lộn nhiều định dạng — và lưu ý rằng “Khoảng trắng” luôn là một lựa chọn chủ đích chứ không bao giờ tự động, vì các mục như họ và tên người chứa khoảng trắng bên trong, nếu mặc định chia tách theo khoảng trắng thì sẽ làm hỏng danh sách nhiều hơn là giúp ích. “Số lượng mục chọn” quyết định số mục được bốc thăm, từ 1 đến 100. Bạn muốn chọn ba người trúng giải từ 200 người tham gia? Dán danh sách người tham gia, đặt “Số lượng mục chọn” thành 3, và nhấn “Tạo”. Có hai điều khiển chỉ áp dụng khi số lượng từ 2 trở lên và sẽ bị mờ đi cho đến lúc đó: “Không lặp lại”, quyết định xem một mục có thể được bốc trúng hai lần hay không, và “Định dạng kết quả”, thiết lập cách phân cách các kết quả được chọn — “Mỗi mục trên một dòng mới”, “Phân cách bằng khoảng trắng”, hoặc “Phân cách bằng dấu phẩy”.
Một hàng nút bên trong hộp “Mục” thực hiện các thao tác chỉnh sửa mà bạn thường phải làm ở ứng dụng khác. “Tải từ tập tin” lấy danh sách trực tiếp từ một tập tin văn bản thuần túy hoặc CSV. “Xáo trộn” thay đổi thứ tự các mục trong hộp, “Sắp xếp” xếp chúng theo bảng chữ cái với các con số được sắp xếp tự nhiên và cú nhấp thứ hai sẽ đảo ngược lại, còn “Xóa” sẽ làm trống hộp. “Điền dữ liệu mẫu” đưa vào một danh sách ví dụ ngắn để bạn có thể thử nghiệm công cụ chỉ với một cú nhấp chuột, trong khi “Mở rộng” mở bung hộp văn bản để hiển thị toàn bộ một danh sách dài và “Thu gọn” xếp nó trở lại kích thước mặc định. Dưới phần kết quả, “Sao chép tất cả” đưa từng kết quả được chọn vào bộ nhớ tạm của bạn, “Lưu vào tệp” xuất chúng ra thành một tập tin, và “Lịch sử” lưu giữ 10 lần rút thăm gần nhất ngay trong trình duyệt của bạn, vì vậy một kết quả cũ chỉ cách bạn một cú nhấp chuột.
Lượt chọn thực sự được thực hiện như thế nào? Khi bạn nhấn “Tạo”, trang web yêu cầu trình duyệt cung cấp các giá trị ngẫu nhiên thông qua crypto.getRandomValues và dùng chúng để chọn các vị trí trong danh sách của bạn, thay vì đi qua một hàm giả ngẫu nhiên của JavaScript như Math.random(). Chuyển đổi một giá trị 32-bit thô thành một vị trí chính là chỗ mà các công cụ chọn ngẫu nhiên thường âm thầm làm sai: lấy giá trị modulo cho chiều dài danh sách là cách tiếp cận rõ ràng nhất nhưng lại thiên lệch, bởi vì trừ khi 2^32 chia hết cho chiều dài của danh sách, các mục ở gần đầu danh sách sẽ xuất hiện thường xuyên hơn một chút so với phần còn lại. Lỗi này được gọi là modulo bias, và nó hoàn toàn có thể đo lường được chứ không chỉ nằm trên lý thuyết. Công cụ này thay vào đó sẽ loại bỏ bất kỳ giá trị nào vượt quá bội số chính xác lớn nhất của chiều dài danh sách và bốc thăm lại — một kỹ thuật được gọi là rejection sampling. Nó tốn thêm vài lần bốc phụ nhưng đổi lại mang đến một sự đảm bảo chính xác tuyệt đối thay vì chỉ xấp xỉ. Vị trí trong danh sách không làm thay đổi điều gì: mục đầu tiên và mục cuối cùng có xác suất hoàn toàn bằng nhau trong mọi đợt rút thăm.
Tùy chọn “Không lặp lại” phân tách hai loại bốc thăm thực sự khác biệt, và thống kê học có tên gọi riêng cho từng loại. Khi được bật, công cụ sẽ xáo trộn một bản sao danh sách của bạn bằng thuật toán Fisher-Yates và lấy các mục từ trên xuống — y hệt như việc bốc thăm từ một chiếc hộp mà không bỏ lại vào trong, vì vậy không ai bị bốc trúng hai lần và mọi nhóm có cùng kích thước đó đều có cơ hội ngang nhau. Đó là lấy mẫu không hoàn lại (sampling without replacement), và nó là thứ bạn cần cho việc tìm người trúng giải, chia đội, và thứ tự lượt chơi. Khi tắt tùy chọn này, mỗi lượt chọn được thực hiện độc lập từ toàn bộ danh sách, do đó cùng một mục có thể xuất hiện nhiều hơn một lần — lấy mẫu có hoàn lại (sampling with replacement), chính là thứ bạn cần khi mọi người vẫn đủ điều kiện tham gia ở mỗi vòng, như trong các đợt rút thăm lặp lại hoặc lấy mẫu thống kê nhanh. Không có chế độ nào công bằng hơn chế độ kia; chúng chỉ đơn giản là trả lời cho những câu hỏi khác nhau.
Một đợt rút thăm công bằng vốn không hề trông có vẻ công bằng. Rút năm tên từ mười tên và bạn sẽ thường xuyên thấy hai kết quả nằm cạnh nhau trong danh sách gốc, hoặc cùng một tên xuất hiện hai lần liên tiếp khi cho phép lặp lại, và tất cả những điều đó đều hoàn toàn bình thường. Mỗi đợt rút thăm đều độc lập: những kết quả trước đó không có bất kỳ ảnh hưởng nào đến những kết quả sau, và không có ai tự nhiên trở nên “tới lượt” phải thắng cả. Bản năng luôn khăng khăng điều ngược lại chính là gambler's fallacy, và nó cũng là bản năng khiến chúng ta rất tệ trong việc tự mình lựa chọn ngẫu nhiên — khi được yêu cầu chọn ngẫu nhiên, chúng ta thường tránh mục đầu và mục cuối, tránh lặp lại một cái tên, và phân bổ các lựa chọn của mình đồng đều hơn rất nhiều so với những gì sự ngẫu nhiên thực sự làm. Một kết quả trông gọn gàng và hoàn hảo một cách đáng ngờ chính là dấu vân tay của con người; sự ngẫu nhiên thực sự luôn tạo ra những cụm tụ tập.
Tại sao nên chọn công cụ rút thăm ngẫu nhiên này?
- Chỉ xử lý trên trình duyệt: danh sách của bạn được đọc trên thiết bị của bạn và không bao giờ bị gửi đi đâu
- Sự ngẫu nhiên từ Web Crypto API: an toàn mật mã học, không dùng Math.random()
- Không có modulo bias: kỹ thuật rejection sampling giữ cho mọi mục có cơ hội hoàn toàn ngang nhau
- Bất kỳ định dạng danh sách nào: mỗi dòng một mục, bằng dấu phẩy, hoặc bằng khoảng trắng, không cần định dạng lại
- Chế độ “Không lặp lại”: bốc thăm người chiến thắng hoặc chia đội mà không ai bị chọn hai lần
- Tối đa 1000 mục, và lên đến 100 lượt chọn trong một lần rút thăm
- Tích hợp sẵn công cụ xử lý: tải từ tập tin, xáo trộn, sắp xếp, xóa, dữ liệu mẫu
- Lịch sử và Lưu vào tệp: giữ lại hồ sơ của đợt bốc thăm mà bạn có thể cần để đối chứng
- Không giới hạn và miễn phí: không cần đăng ký, không giới hạn số lần sử dụng, không lưu gì trên máy chủ của chúng tôi
Việc chọn ngẫu nhiên xuất hiện ở bất cứ nơi nào một quyết định cần phải đứng vững trước những nghi ngờ. Giáo viên gọi học sinh phát biểu mà không thiên vị và chia lớp thành các nhóm làm dự án. Các streamer và nhân viên tiếp thị bốc thăm người trúng giải trước một lượng khán giả cần phải tin vào kết quả đó. Người quản lý phân chia các nhiệm vụ mà không ai tự nguyện nhận, và các đội quyết định thứ tự thuyết trình hoặc ai sẽ trực ban. Các nhà nghiên cứu lấy một mẫu hồ sơ ngẫu nhiên để kiểm toán. Các gia đình kết thúc cuộc tranh luận về việc nên xem phim gì, và một nhóm bạn đang đói bụng chọn quán lẩu để ăn. Điểm chung của chúng là một sự lựa chọn mà bất kỳ ai cũng có thể giải thích rõ ràng sau đó: đợt rút thăm sử dụng tính ngẫu nhiên mật mã học, nó diễn ra hoàn toàn trên thiết bị của bạn, và “Lịch sử” lưu giữ kết quả phòng trường hợp có ai đó thắc mắc về nó sau này.
Có một vài giới hạn thực tế đáng để biết. Công cụ này không thể chọn ra nhiều mục khác biệt hơn số lượng danh sách của bạn có — ba người trúng giải cần ít nhất ba cái tên — và nó dừng lại ở 1000 mục, mỗi mục 200 ký tự, với tối đa 100 kết quả trong một đợt rút thăm. “Xáo trộn” và “Sắp xếp” hoạt động theo từng dòng, vì vậy một danh sách phân cách bằng dấu phẩy được dán trên một dòng duy nhất sẽ chỉ được xáo trộn khi nó đã trở thành mỗi mục trên một dòng; và cả hai nút này đều chỉ sắp xếp lại hộp văn bản chứ không phải thay đổi cơ chế rút thăm, vốn dĩ luôn công bằng bất kể các mục của bạn nằm ở thứ tự nào. Mỗi mục cũng mang trọng số hoàn toàn bằng nhau theo thiết kế, vì vậy một đợt rút thăm mà một tên cần được tính gấp đôi thì tên đó phải được liệt kê hai lần trong danh sách. Nằm trong những giới hạn đó, sự đảm bảo là vô cùng vững chắc — mọi mục trong danh sách của bạn đều có cơ hội hoàn toàn bằng nhau, trong mọi đợt rút thăm.