会議室に落ちる沈黙と、動かない指先
週に一度の定例会議。進行役が「今日の発表順を決めよう」と言った瞬間、それまで流れていた会話の熱がすっと引いていく。8人の視線は机の端や資料の隅に吸い寄せられ、誰も目を合わせようとしない。キーボードを叩く音が止まり、エアコンの送風音だけが妙に大きく響く。
沈黙が30秒、1分と積み重なるたび、胸の奥で焦りが膨らむ。喉が乾き、唾を飲み込む音さえ聞こえそうな静けさ。背中にはじんわり汗が滲み、指先はマーカーを握ったまま動かない。早く決めなければならないという圧迫感と、誰が最初になっても不満が出ない「公平性」を担保しなければならない責任が、重く肩にのしかかる。
じゃんけんで決めようとしても「あいこ」が続き、3分以上かかる。あみだくじを描こうとした瞬間、マーカーのインクが切れて線がかすれ、誰がどこにつながっているのか判別不能になる。番号を割り当ててシャッフルする既存ツールを開いても、名前を直接扱えないため、結局メモ帳で「1番=佐藤」のように照合する羽目になる。
この停滞を物理的に排除し、0.1秒で全員が納得する結論を出すための道具が必要だと痛感した。この記事では、既存ツールの限界、偏りのないシャッフルを実現するための技術判断、そして4つのモードを1つに統合した理由をまとめる。
既存ツールの限界と欠点
欠点1: 番号と名前の二重管理が生む致命的な停滞
既存ツールの多くは「人数を入力して1〜8の番号をシャッフルする」という数学的な機能に特化している。しかし現場で求められているのは「3番が当たった」ではなく、「次は佐藤さん」という直感的な指名だ。
番号と名前を照合する作業が発生するたびに、会議のテンポは無惨に分断される。
- 数字だけが並び替わった結果が出る
- メモ帳を開き、「3番は……佐藤だ」と確認
- ホワイトボードに書き写す
- 参加者はスマホを眺め始める
この「脳内照合コスト」が、わずか数分のロスを何倍ものストレスへと増幅させていた。
欠点2: モードが分断されていて連続利用に向かない
順番決めはAサイト、チーム分けはBアプリ、くじ引きはCツール。 会議では「発表順 → チーム分け → 代表者の抽選」という連続的な流れがよくある。
8人の名前を3回入力すると、合計24回のタイピング。 この無駄な反復作業が、現場の集中力を確実に削っていた。
欠点3: 結果をコピーできず、手動の書き写しが発生する
結果をSlackやLINEに共有したいのに、コピー機能がないツールが多い。 スクショでは文字が読みにくく、再利用もできない。
12人の順番を手入力で書き写すと約40秒から1分。 UXの観点でも、共有のしづらさは致命的だ。 参考: What is UX - web.dev
試行錯誤:設計判断の裏側
sort(Math.random) の偏りに気づいた失敗
開発初期、最も簡潔に実装できる以下のシャッフルコードを検討した。
array.sort(() => Math.random() - 0.5);
しかし1000回以上のシミュレーションを実行すると、明らかな偏りが発生した。
- 特定の要素が元の位置に留まりやすい
- 先頭に来る確率が均等にならない
- 並び順のパターンに偏りが出る
原因は、JavaScriptの sort が比較関数の戻り値に依存しており、すべての組み合わせを等確率で生成するようには設計されていないからだ。
参考: MDN Array.sort
トレードオフ:公平性 vs 実装コスト
| 方式 | 公平性 | 実装コスト | 採用判断 | |------|--------|------------|----------| | sort(Math.random) | 低い | 低い | 却下 | | Fisher-Yates | 高い | 中 | 採用 | | 暗号学的乱数 | 非常に高い | 高い | 過剰 |
Fisher-Yates は「トランプの束からランダムに1枚抜き、新しい束に積み上げていく」動作に近い。 すべての並び順が等確率(1/n!)で出現することが保証される。 参考: Fisher–Yates shuffle - Wikipedia
設計思想:名簿保存はするが、プライバシーは守る
毎回同じメンバーを入力するのは苦痛だが、ユーザー登録を強いるのは重い。 そこで localStorage を採用した。
- サーバーには一切送信しない
- ブラウザ内だけで保持
- 次回アクセス時に自動復元
解決策:公平な配置係の紹介
この問題を解決するために作ったのが公平な配置係。
使い方はシンプル。
- 名前を入力する(名簿保存で自動復元)
- モードを選ぶ(順番・チーム分け・ルーレット・くじ引き)
- シャッフルボタンを押す
- 結果をコピーして共有する(3形式に対応)
4つのモードを1つに統合した理由は、現場でアプリを切り替えるストレスをなくすためだ。
よくある質問(FAQ)
Q: 欠席者がいる場合はどう扱えばいい?
名前の横のチェックを外すだけで抽選対象から除外できる。名簿を壊さずに運用できる。
Q: Fisher-Yatesはなぜ公平なの?
未処理の範囲からランダムに1つ選んで入れ替える方式で、全ての並び順が等確率になる。
Q: データはサーバーに送信される?
すべてブラウザ内で処理される。サーバーにデータは送信されないし、ブラウザを閉じれば入力内容は消える。
Q: 会議で使うときのコツはある?
開始前に名簿を呼び出しておくとスムーズ。コピー形式を使い分けると共有が速い。
まとめ
番号と名前の照合、モード分断、コピー不可という現場のストレスを解消するために、Fisher-Yatesと名簿保存、4モード統合を組み合わせたのが公平な配置係だ。
順番決めやチーム分けを効率化したいときは公平な配置係を試してみて。 飲み会の会計で悩む場面では不平等割り勘マスターも便利。
不具合や要望があれば、お問い合わせページから気軽に教えてほしい。