CodeKitHub
Công cụ Tạo dữ liệu

Công cụ rút thăm tên

Cập nhật lần cuối:

Rút tên cho Secret Santa hoặc trao đổi quà tặng bằng tay gặp phải một vấn đề toán học thực sự: một phép xáo trộn ngẫu nhiên thuần túy có thể vô tình gán một người cho chính họ, và việc rút lại cho đến khi "trông có vẻ đúng" thì thực ra không còn ngẫu nhiên nữa. Công cụ này giải quyết vấn đề đó một cách chính xác — nhập tên của mọi người, và nó sẽ tính toán một derangement (một phép xáo trộn với đảm bảo toán học rằng không ai rơi vào chính tên của mình), sau đó ẩn mỗi kết quả sau một nút chạm-để-hiển thị để mọi người có thể kiểm tra phần gán của riêng mình trên một màn hình dùng chung mà không thấy phần của người khác.

Công Cụ Này Là Gì?

Derangement là một khái niệm toán học cụ thể: một hoán vị (sắp xếp lại) của một tập hợp mà không phần tử nào kết thúc ở vị trí ban đầu của nó. Áp dụng vào trao đổi quà tặng, điều đó có nghĩa là xáo trộn tên của mọi người thành một thứ tự mới sao cho không ai bị ghép với chính mình — chính xác là ràng buộc mà một cuộc rút thăm Secret Santa công bằng cần, và chính xác là điều mà một phép xáo trộn đơn giản kiểu `array.sort(() => Math.random() - 0.5)` KHÔNG tự đảm bảo được.

Công cụ này tạo ra một derangement bằng cách xáo trộn danh sách lặp đi lặp lại với một thuật toán ngẫu nhiên và kiểm tra ràng buộc tự-gán, sử dụng `crypto.getRandomValues()` cho tính ngẫu nhiên bên dưới thay vì `Math.random()` — cùng nguồn ngẫu nhiên an toàn mật mã học được dùng bởi [Công cụ tạo mật khẩu](/password-generator/) và [Công cụ tạo chữ cái ngẫu nhiên](/random-letter-generator/) của trang này.

Thiết kế nút hiển thị giải quyết một vấn đề thực tế riêng biệt khi rút tên theo nhóm: hiển thị mọi kết quả gán trên màn hình cùng lúc sẽ làm lộ bất ngờ cho tất cả mọi người cùng một lúc. Việc ẩn kết quả của mỗi người sau nút riêng cho phép một thiết bị được truyền tay nhau (hoặc màn hình được chia sẻ) để mỗi người chỉ kiểm tra tên của riêng mình.

Tại Sao Nên Dùng?

  • Buổi họp mặt gia đình lớn vừa bắt đầu và ai đó vừa đề xuất bốc thăm tặng quà ngẫu hứng — mở công cụ này trên điện thoại, gõ tên hơn chục anh chị em họ, xong xuôi trước khi đĩa bánh thứ hai được dọn ra.
  • Nhóm chat công ty đã thống nhất chơi Secret Santa nhưng chẳng ai muốn làm người "biết hết các cặp" — chạy rút thăm trên một điện thoại rồi truyền tay để mỗi người tự bấm nút hiển thị của mình, không ai phải giữ bí mật cho cả nhóm.
  • Bạn từng gặp sự cố với cách rút thăm thủ công trước đây — có người viết tên mình rồi lén đổi giấy — giờ muốn một cách chắc chắn không thể gian lận và không bao giờ vô tình gán ai vào chính họ.
  • Hai ngày trước sự kiện, một thành viên trong gia đình đột ngột không tham gia được — chỉ cần xóa tên khỏi danh sách và rút lại trong vài giây, không phải lập lại nhóm chat hay danh sách từ đầu.
  • Bạn đang tổ chức trao đổi quà cho một nhóm sở thích mà các thành viên chưa thân nhau lắm và muốn đảm bảo quy trình công bằng mà không cần giải thích công thức toán học cho mọi người.
  • Mọi dữ liệu chỉ tồn tại trong trình duyệt ngay lúc đó — đóng tab lại là không còn danh sách tên hay cặp ghép nào lưu trên bất kỳ máy chủ nào.

Cách Sử Dụng

  1. Gõ tên của mỗi người tham gia trên một dòng riêng — ít nhất 3 tên khác nhau.
  2. Nhấp "Draw pairs" — công cụ sẽ tính toán một derangement hợp lệ để không ai bị ghép với chính mình.
  3. Mỗi hàng của người tham gia hiển thị tên của họ cùng một kết quả bị ẩn — truyền thiết bị xung quanh hoặc chia sẻ màn hình, và để mỗi người nhấp nút "Tap to reveal" của riêng mình để xem họ tặng quà cho ai.
  4. Nhấp hiển thị lại lần nữa để ẩn nó đi sau khi ai đó đã kiểm tra kết quả của họ, giữ màn hình sẵn sàng cho người tiếp theo.

Ví dụ

Đầu vào

Alice, Bob, Carol, Dave

Đầu ra

Alice → Carol, Bob → Dave, Carol → Bob, Dave → Alice

Mỗi lần chạy cho ra một derangement hợp lệ khác nhau — đây là một kết quả ví dụ. Chú ý rằng không ai bị gán cho chính mình, đây là ràng buộc bắt buộc duy nhất mà một cuộc rút thăm Secret Santa thực sự cần và một phép xáo trộn ngẫu nhiên đơn thuần không đảm bảo được.

Derangement so với xáo trộn ngẫu nhiên đơn thuần

Một phép xáo trộn đơn thuần và một derangement trông tương tự nhau nhưng chỉ một trong hai thực sự an toàn cho trao đổi quà tặng.

Phương phápCó thể gán ai đó cho chính họ không?Có công bằng khi rút lại cho đến khi "trông có vẻ đúng" không?
Xáo trộn ngẫu nhiên đơn thuầnCó — một khả năng thực sự, đặc biệt trong các nhóm nhỏKhông — việc thủ công loại bỏ kết quả xấu làm thiên vị kết quả cuối cùng
Derangement (công cụ này)Không — bị loại trừ về mặt toán học ngay từ cách xây dựngKhông áp dụng — mọi kết quả hợp lệ đều đã thỏa mãn ràng buộc

Công cụ liên quan

Để rút thăm ngẫu nhiên và các công cụ tạo khác, hãy thử các công cụ này.

Công cụ tạo tên giả tưởng · Công cụ tạo số ngẫu nhiên · Công cụ tạo chữ cái ngẫu nhiên

Cách dùng để buổi trao đổi quà diễn ra suôn sẻ

  • Thống nhất mức ngân sách quà tặng trước khi rút thăm, không phải sau — một khi các cặp đã được ấn định, sẽ quá muộn để thay đổi thỏa thuận mà không có ai cảm thấy không công bằng.
  • Với sự kiện công ty hoặc cộng đồng đông người, hãy rút thăm trước mặt mọi người bằng cách truyền tay một chiếc điện thoại — điều này thực ra minh bạch hơn nhiều so với việc một người tự rút riêng rồi báo qua tin nhắn cá nhân.
  • Nếu sự kiện diễn ra qua video call, chia sẻ màn hình lúc rút thăm nhưng để từng người lần lượt điều khiển từ xa hoặc luân phiên chia sẻ màn hình để tự bấm nút hiển thị của mình.
  • Chỉ chụp màn hình kết quả nếu ban tổ chức thực sự cần lưu dự phòng — vì mục đích của nút hiển thị là giữ bất ngờ, một ảnh chụp toàn màn hình có thể để lộ tất cả các cặp cùng lúc.

Câu Hỏi Thường Gặp

Điều gì xảy ra nếu một tên được nhập hai lần?

Công cụ yêu cầu mỗi tên phải duy nhất trước khi rút thăm — nếu phát hiện một dòng trùng lặp, nó sẽ yêu cầu bạn sửa lại danh sách trước, vì hai người tham gia có tên giống hệt nhau sẽ khiến không thể phân biệt kết quả của họ.

Có ai có thể rút được tên của chính mình không?

Không — công cụ cụ thể tính toán một derangement, một phép xáo trộn có tính chất toán học rằng không phần tử (người) nào kết thúc ở vị trí ban đầu của chính nó. Sự đảm bảo đó được thực thi bởi thuật toán, chứ không phó mặc cho may rủi như một phép xáo trộn ngẫu nhiên đơn thuần.

Số người tối thiểu cần thiết là bao nhiêu?

Ba người. Với chỉ hai người, một derangement là bất khả thi trừ khi họ đơn giản được gán cho nhau mỗi lần, điều này không thực sự mang tính ngẫu nhiên, nên công cụ yêu cầu ít nhất ba người tham gia.

Làm thế nào để giữ kết quả riêng tư nếu tất cả chúng tôi đang nhìn cùng một màn hình?

Kết quả của mỗi người tham gia được ẩn sau nút "Tap to reveal" riêng thay vì hiển thị tất cả cùng lúc. Truyền thiết bị (hoặc chia sẻ màn hình) cho từng người lần lượt, để họ hiển thị và ghi nhớ chỉ hàng của riêng mình, sau đó nhấp lại để ẩn nó trước khi chuyển cho người tiếp theo.

Tên hoặc kết quả rút thăm có được gửi đến máy chủ không?

Không. Mọi thứ — đọc tên, tính toán derangement, và hiển thị các nút chạm-để-hiển thị — đều 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, và việc đóng tab sẽ xóa mọi thứ, nên không có lịch sử rút thăm nào còn sót lại ở bất kỳ đâu có thể vô tình làm lộ bí mật.

Tôi có thể loại trừ một số cặp cụ thể, ví dụ vợ chồng để họ không rút phải nhau không?

Hiện công cụ chỉ đảm bảo ràng buộc derangement cơ bản (không ai rút phải chính mình), chứ chưa hỗ trợ loại trừ cặp cụ thể. Nếu kết quả rút ra khiến hai vợ chồng rơi vào nhau, cách thực tế nhất là nhấn "Draw pairs" lại để có một derangement mới cho đến khi ra tổ hợp bạn muốn.

Kết quả có thay đổi mỗi lần tôi nhấn nút rút lại không?

Có — mỗi lần nhấn sẽ tính lại một derangement hoàn toàn mới bằng tính ngẫu nhiên mật mã học, nên bạn có thể rút nhiều lần cho đến khi hài lòng, và mỗi kết quả đều hợp lệ về mặt toán học như nhau (không ai rút phải chính mình).

Tôi có cần nhập họ tên đầy đủ không, hay chỉ biệt danh cũng được?

Biệt danh hoặc tên gọi thân mật đều được, miễn là mỗi tên trong danh sách khác nhau — công cụ chỉ cần các chuỗi ký tự duy nhất để phân biệt từng người, không kiểm tra đó có phải tên thật hay không.

Nếu nhóm của chúng tôi rất đông, ví dụ 30 người trong công ty thì sao?

Không có giới hạn số lượng tên có thể nhập — thuật toán derangement chạy nhanh như nhau dù với 3 người hay 30 người, vì mọi phép tính đều diễn ra tức thì trong trình duyệt mà không cần gửi dữ liệu lên máy chủ.

Công Cụ Liên Quan