シークレットサンタの抽選方法
- 参加者の名前を1行に1人ずつ入れます。3人から100人まで使えます。
- カップルや家族など、お互いを引かないほうがいい人は「お互いを引かないペア」に追加します。
- 必要ならプレゼントの予算、交換する日、メッセージを入れて「抽選する」を押します。
- 一人ひとりに本人の個別リンクを送ります。リンクを開いてプレゼントの箱を開けると、贈る相手と予算、日付が表示されます。
主催者にも結果を知られずに進める
結果の一覧には名前とリンクのボタンだけが表示され、誰が誰を引いたかは出ません。リンクを開かずにコピーまたは送信だけすれば、主催者も相手を知らないまま参加者として楽しめます。コピーまたは送信した名前には「送信済み」と表示されるので、送り忘れを防げます。参加しない主催者なら「全体の結果を見る」で組み合わせを確認できます。
リンクのしくみ
抽選結果はサーバーではなく、各リンクの#より後ろの部分に入っています。ブラウザはURLの#以降をサイトに送らないため、SpinPickのサーバーには名前も結果も残りません。1つのリンクにはその人の組み合わせしか入っていないので、受け取った人がほかの人の相手を知ることはできません。
ただし、リンクの中身は一目では読めないように混ぜてあるだけで、暗号化ではありません。すべてのリンクを持つ主催者や、リンクを受け取った人がその気になれば解読できます。サーバーを使わない方式の限界なので、各自が自分のリンクだけを開く約束で楽しんでください。
抽選の方法
全員が自分以外の1人を引き、全員がちょうど1回ずつ引かれるように組み合わせます(数学では完全順列や攪乱順列と呼ばれます)。ブラウザのcrypto.getRandomValuesで順番を混ぜ、自分自身を引かない、除外ペア、お互いに引き合わない(任意)という条件をすべて満たすまで混ぜ直すので、条件を満たす組み合わせはどれも同じ確率で選ばれます。除外ペアが多く2万回混ぜても見つからない場合は探索で組み合わせを見つけ、条件上不可能な場合はその理由をお知らせします。
プレゼント交換をもっと楽しく
- 予算を決めておくと、値段の差で気まずくなりにくくなります。
- グループチャットに一人ひとつずつ欲しいもののヒントを出しておくと選びやすくなります。
- この遊びは英語圏ではSecret Santa、スペイン語圏ではamigo invisible、韓国ではマニト(마니또)と呼ばれます。