Công Cụ Này Là Gì?
Công cụ xáo trộn danh sách sắp xếp lại một tập hợp các mục thành một trình tự ngẫu nhiên, hoặc rút ra một tập con ngẫu nhiên từ đó. Phần khó là làm điều này mà không có thiên vị: cách làm đơn giản như sắp xếp một mảng bằng hàm so sánh ngẫu nhiên tạo ra phân bố lệch, trong đó một số thứ tự có khả năng xuất hiện cao hơn nhiều so với những thứ tự khác.
Công cụ này dùng thuật toán xáo trộn Fisher–Yates (Durstenfeld), phương pháp chuẩn để tạo hoán vị ngẫu nhiên đồng nhất có thể chứng minh được — mọi thứ tự có thể của danh sách của bạn đều có khả năng xuất hiện như nhau.
Tại Sao Nên Dùng?
- Xáo trộn thực sự không thiên vị — Fisher–Yates, không phải anti-pattern sort(() => Math.random() - 0.5) phổ biến gây lệch kết quả.
- Chế độ chọn người thắng: rút đúng N mục ngẫu nhiên thay vì xáo trộn toàn bộ danh sách, lý tưởng cho vé số và giveaway.
- Tùy chọn loại bỏ trùng lặp trước khi xáo trộn, cho các danh sách có thể có mục lặp lại vô tình.
- Hoạt động với bất kỳ văn bản nào — tên, công việc, vé, giải thưởng — mỗi mục một dòng.
- Riêng tư: việc xáo trộn diễn ra hoàn toàn trong trình duyệt của bạn, không có gì được tải lên.
Cách Sử Dụng
- Dán danh sách của bạn vào ô, mỗi mục một dòng.
- Tùy chọn tích "loại bỏ trùng lặp trước khi xáo trộn" nếu danh sách có thể chứa mục lặp lại.
- Để sắp xếp lại toàn bộ, chỉ cần nhấn Shuffle. Để chọn người thắng, tích tùy chọn N-mục và đặt số lượng cần rút.
- Sao chép kết quả — nhấn Shuffle lần nữa bất cứ lúc nào để có thứ tự ngẫu nhiên mới hoặc lượt rút mới.
Ví dụ
Đầu vào
Alice
Bob
Charlie
Diana
EthanĐầu ra
Một danh sách được sắp xếp lại ngẫu nhiên như Charlie, Ethan, Alice, Diana, Bob — khác nhau mỗi lần bạn nhấn Shuffle.Với chế độ chọn người thắng đặt là 2, cùng đầu vào đó có thể tạo ra chỉ Ethan và Alice — một lượt rút 2 mục ngẫu nhiên, không phải một lát cắt 2 mục từ một thứ tự đã xáo trộn.
Tại sao xáo trộn đơn giản tạo ra kết quả thiên vị
sort(() => Math.random() - 0.5) là một mẹo phổ biến trông có vẻ đúng nhưng không đúng: nó dựa vào việc thuật toán sắp xếp gọi hàm so sánh một số lần cụ thể theo một mẫu cụ thể, và các triển khai sort thực tế không đảm bảo điều đó. Hiệu ứng thực tế là một kiểu xáo trộn trong đó một số thứ tự nhất định xuất hiện thường xuyên hơn những thứ tự khác — đủ tinh vi để qua mắt khi nhìn thoáng qua, nhưng có thể đo lường thống kê được qua nhiều lần chạy.
Fisher–Yates né tránh toàn bộ vấn đề: thay vì yêu cầu thuật toán sắp xếp tạo ra tính ngẫu nhiên một cách gián tiếp, nó trực tiếp hoán đổi mỗi vị trí với một vị trí còn lại ngẫu nhiên đúng một lần, điều này có thể chứng minh là đồng nhất bất kể triển khai sắp xếp của ngôn ngữ nền tảng.
Câu Hỏi Thường Gặp
Tại sao không chỉ dùng array.sort(() => Math.random() - 0.5)?
Dòng lệnh một dòng đó là một anti-pattern nổi tiếng: sort() của JavaScript không đảm bảo mỗi cặp phần tử được so sánh cùng số lần, nên thứ tự kết quả bị lệch có thể đo lường được về phía một số hoán vị nhất định — một số mục có khả năng nằm gần đầu hoặc cuối cao hơn so với tính ngẫu nhiên thực sự. Fisher–Yates tránh hoàn toàn vấn đề này bằng thiết kế, và đó là thuật toán mà công cụ này thực sự triển khai.
Thứ tự xáo trộn có thực sự không thiên vị không?
Có. Fisher–Yates duyệt qua danh sách một lần, và ở mỗi bước, hoán đổi mục hiện tại với một mục ngẫu nhiên đồng nhất từ phần chưa xáo trộn còn lại. Điều này được chứng minh toán học là tạo ra mọi thứ tự có thể với xác suất bằng nhau, với nguồn ngẫu nhiên tốt (Math.random() của JavaScript).
Sự khác biệt giữa chế độ xáo trộn và chế độ chọn người thắng là gì?
Chế độ Shuffle sắp xếp lại mọi mục trong danh sách của bạn và hiển thị tất cả, chỉ theo thứ tự mới. Chế độ chọn người thắng chỉ rút N mục ngẫu nhiên và chỉ hiển thị những mục đó — hữu ích khi bạn muốn chọn một số lượng cố định người thắng hoặc mẫu mà không tiết lộ toàn bộ danh sách đã sắp xếp lại.
Tôi có thể dùng công cụ này cho một lượt rút giải thưởng hoặc vé số thật không?
Có, với các giveaway và lượt rút không chính thức, công cụ này hoạt động tốt vì tính ngẫu nhiên thực sự đồng nhất. Đối với chương trình khuyến mãi được quy định pháp lý với giải thưởng bằng tiền, hãy kiểm tra quy định địa phương của bạn — một số khu vực pháp lý yêu cầu quy trình rút thăm có thể kiểm toán cụ thể.
Loại bỏ trùng lặp có thay đổi danh sách gốc của tôi không?
Không — việc loại bỏ trùng lặp chỉ ảnh hưởng đến kết quả đã xáo trộn, và chỉ khi ô tích được bật. Danh sách đầu vào của bạn giữ nguyên như bạn đã gõ, nên bạn có thể bật/tắt tùy chọn và xáo trộn lại mà không cần gõ lại gì cả.