30人のシャッフルを3秒で
「今日の発表、誰から?」「チーム分けどうする?」「買い出し誰が行く?」
こういう場面でじゃんけんしたり、あみだくじ描いたりするのは正直めんどくさい。 この乱数アプリは、名前を入れるだけで順番決め・チーム分け・ルーレット・くじ引きができるツール。 数字じゃなくて名前を扱えるから、結果をそのまま使える。Fisher-Yatesアルゴリズムによる完全な公平性つき。
なぜ公平な配置係を作ったのか
開発のきっかけ
きっかけは職場の会議。毎回「誰から発表する?」で沈黙が流れて、結局いつも同じ人が最初に話す。「ランダムに決めよう」となっても、じゃんけんは時間がかかるし、あみだくじを描く紙がない。
スマホで「乱数 アプリ」と検索すると、出てくるのは数字を生成するだけのツールばかり。「1〜30の乱数」を出されても、「で、3番って誰?」となる。名前を直接扱えるランダムツールが欲しかった。
さらに、チーム分けの場面でも困った。30人のクラスを6チームに分けたいとき、既存ツールだと「1人ずつ引く」形式で、全員分やるのに5分以上かかる。一発で全チームの結果が出るものが必要だった。
こだわった設計判断
- 名前ベースの入出力: 数字ではなく名前を直接入力・表示する設計。「3番: 太郎」ではなく「太郎」がそのまま結果に出る。結果をそのまま共有できるから、変換の手間がない
- 4モードの統合: 順番・チーム分け・ルーレット・くじ引きを1つのアプリに統合した。名簿を1回入力すれば、目的に応じてモードを切り替えるだけ
- 名簿保存: よく使うメンバーリストをブラウザに保存できるようにした。毎回30人分の名前を入力するのは現実的じゃないから、保存・呼び出しは必須機能
活躍する場面
プレゼンや面接の順番決め
会議で「誰から発表する?」の沈黙を回避。全員の名前を入れて順番生成モードを押すだけ。結果をモニターに映せば透明性も抜群。
グループワークのチーム編成
クラス30人を6チームに分けたい場合。チーム分けモードでチーム数を6に設定して実行するだけ。先生の主観が入らないから、生徒も納得しやすい。
飲み会の幹事・当番決め
ルーレットモードで1人を選出。画面を全員に見せながらやれば透明性も抜群。「またお前かよ」感はあるかもしれないけど、少なくとも公平ではある。
景品抽選会
社内イベントで20人中5人に景品を配りたい場合。くじ引きモードで当たり数を5に設定。一度に全当選者が決まるから、1人ずつ引くより圧倒的に早い。
4つのモード
順番生成
全員の順番をランダムに決定する。発表順、面接順、カラオケの歌う順番など、「全員が1回ずつ何かをする」場面向き。
チーム分け
指定した数のチームに均等分割。グループワーク、スポーツのチーム編成、清掃当番のグループ分けに使える。
ルーレット
1人だけランダムに選出する。当番決め、幹事決め、買い出し担当の選出など。全員が同じ確率で選ばれるから、文句が出にくい。
くじ引き
当たり数を指定して複数人を抽選する。景品抽選、代表者選出、委員会メンバーの決定に対応。
基本の使い方
名前を入れてモードを選んでボタンを押す。たった3ステップで完了。
Step 1: 名前を入力する
テキストエリアに参加者の名前を入れる。改行区切りでもカンマ区切りでもOK。Excelやスプレッドシートからコピペする場合は、改行区切りが自動認識されるからそのまま貼り付ければいい。
Step 2: モードを選ぶ
4つのモードから目的に合ったものを選択する。チーム分けならチーム数、くじ引きなら当たり数も設定する。
Step 3: 実行して結果を確認する
実行ボタンを押すと、即座に結果が表示される。結果はコピー機能でLINEやチャットに共有できる。コピー形式は3種類: プレーン(名前だけ)、番号付き(1. 太郎)、CSV(カンマ区切り)。
具体的な使用例(検証データ)
ケース1: 学校のグループワーク編成
クラス30人を6チームに分けたい場合。
入力値:
- 名前: 30人分
- モード: チーム分け
- チーム数: 6
結果:
- チーム1〜6にそれぞれ5人ずつ均等配分
- 実行するたびに異なる組み合わせ
→ 解釈: 30÷6=5人/チーム。Fisher-Yatesシャッフルにより、どのチームに入るかは完全に均等な確率。先生の主観が入らないため、生徒間の不公平感が解消される。
ケース2: 飲み会の幹事決め
8人の中から1人を選出。
入力値:
- 名前: 8人分
- モード: ルーレット
結果:
- 8人の中から1人がランダムに選出
- 各人の選出確率: 正確に1/8(12.5%)
→ 解釈: Fisher-Yatesアルゴリズムにより、すべての要素が等確率で先頭に来る。特定の人が有利・不利になることはない。
ケース3: 景品抽選会
20人中5人に景品を配る。
入力値:
- 名前: 20人分
- モード: くじ引き
- 当たり数: 5
結果:
- 20人の中から5人が一度に選出
- 各人の当選確率: 正確に5/20(25%)
→ 解釈: 1人ずつ引く方式と異なり、一括抽選なので時間が大幅に短縮される。結果はコピーしてその場で全員に共有できる。
ケース4: 会議の発言順
10人の発言順を決定。
入力値:
- 名前: 10人分
- モード: 順番生成
結果:
- 10人の完全ランダムな順番リスト
- すべての並び順が1/3,628,800の等確率
→ 解釈: 10! = 3,628,800通りの並び順がすべて等確率で出現。序盤・終盤の有利不利を気にする必要がなく、「誰から話す?」の沈黙を回避できる。
シャッフルのアルゴリズム
採用している方式
Fisher-Yatesシャッフル(別名: Knuthシャッフル)を使用。1938年にRonald FisherとFrank Yatesが考案し、1964年にDonald Knuthが計算機向けに改良した、配列をランダムに並び替える標準的なアルゴリズム。
参考: The Art of Computer Programming Vol.2 — Knuthの名著でこのアルゴリズムが紹介されている。
具体的な計算例
3人「太郎、花子、次郎」のシャッフル:
初期配列: [太郎, 花子, 次郎]
Step 1: i=2(末尾)、0〜2からランダムに1つ選ぶ → 仮に1
[太郎, 次郎, 花子] ← 花子と次郎を交換
Step 2: i=1、0〜1からランダムに1つ選ぶ → 仮に0
[次郎, 太郎, 花子] ← 太郎と次郎を交換
完了: [次郎, 太郎, 花子]
計算量はO(n)で効率的。そして重要なのは、すべての並び順が完全に同じ確率で出現することが数学的に証明されている点。3人なら6通りの並び順がすべて1/6の確率で出る。
なぜこの方式を選んだか
JavaScriptの Array.sort(() => Math.random() - 0.5) という手法もあるけど、これは各要素の出現確率が均等にならないことが知られている。Fisher-Yatesなら数学的に公平性が保証されるから、「くじ引き」や「当番決め」のような公平性が重要な場面でも安心して使える。
他のランダムツールとの違い
名前を直接扱える
多くの乱数ツールは「1〜30の数字を生成」する仕組み。このツールは名前を直接入力・表示するから、「3番って誰だっけ?」問題が起きない。結果をそのまま共有できる。
名簿保存で毎回の入力を省略
よく使うメンバーリストは名簿として保存できる。「クラスA」「営業チーム」のように名前をつけておけば、次回からワンタップで呼び出せる。除外機能で欠席者だけチェックを外せば、名簿を編集せずに運用できる。
4モードを1つのアプリに統合
順番決め・チーム分け・ルーレット・くじ引きがすべて1つのアプリで完結する。名簿を1回入力すれば、モードを切り替えるだけで目的に応じた結果が出る。
知っておくと便利な乱数の豆知識
コンピュータの「ランダム」は擬似乱数
コンピュータが生成する乱数は、実際には「擬似乱数」と呼ばれるもの。数学的なアルゴリズムで生成されるため、完全な予測不可能性はない。ただし、日常的なくじ引きや順番決めには十分な品質。暗号学的な用途でなければ問題ない。参考: 擬似乱数 — Wikipedia
じゃんけんは本当に公平?
直感的には公平に思えるじゃんけんだけど、心理学の研究では「最初はグーを出しやすい」という傾向が報告されている。また、3人以上のじゃんけんは「あいこ」の確率が急上昇して時間がかかる。4人だと1回で決まる確率はわずか約25%。
ランダムの歴史
人類最古のランダム装置は紀元前3000年頃のサイコロ。古代ローマでは政治的な決定にもくじ引きが使われていた。現代ではコンピュータの擬似乱数が主流だけど、「公平な決め方」への需要は数千年前から変わらない。
使い方のコツ・Tips
Excelからのコピペを活用
名簿管理をExcelやGoogleスプレッドシートでやっている場合、名前の列を選択してコピー → テキストエリアに貼り付けるだけ。改行区切りが自動認識されるから、加工の手間がない。
除外機能で欠席者を管理
保存した名簿の横にチェックボックスがある。今日の欠席者をチェックで除外すれば、名簿を毎回編集しなくてOK。「30人中5人欠席」のような運用がスムーズにできる。
コピー形式を使い分ける
LINEで共有するなら「番号付き」、スプレッドシートに貼るなら「CSV」、シンプルに使うなら「プレーン」。場面に応じてコピー形式を切り替えると便利。
気になるポイントQ&A
Q: データはどこに保存される?
名簿データはブラウザのローカルストレージに保存される。サーバーにデータは送信されない。同じブラウザでなら次回以降も使えるけど、別のデバイスには引き継げない。移行したい場合は名前リストをコピーして持っていく形になる。
Q: 同じ名前が複数ある場合は?
それぞれ別の人として扱われる。区別したい場合は「太郎A」「太郎B」のように分けて入力すればOK。
Q: 本当にランダム?偏りはない?
Fisher-Yatesアルゴリズムを使用しており、すべての並び順が数学的に等確率で出現することが証明されている。特定の人が有利・不利になることはない。
Q: 履歴は残る?
実行結果は自動的に履歴に保存される(最大10件)。うっかり画面を閉じてしまっても、直近の結果は確認できる。ブラウザを閉じるとリセットされる。
まとめ
名前を入れてボタンを押すだけ。順番決め、チーム分け、ルーレット、くじ引きの4つのモードで、日常のランダム選出をカバーできる。名簿保存と除外機能を使えば、毎回の入力も省略可能。Fisher-Yatesアルゴリズムによる完全な公平性つき。
開発の裏側が気になった人は、既存ツール5つ検証で判明した公平シャッフル設計の裏側も読んでみて。なぜsort(Math.random)を捨てたのか、試行錯誤の全記録をまとめている。
テニスの対戦組み合わせを決めたいならテニス組み合わせ職人を試してみて。飲み会の割り勘なら不平等割り勘マスターで、負担割合が違う人がいるときの金額もサクッと出せる。
不具合や要望があれば、お問い合わせページから気軽に教えてほしい。