
この記事は 弁護士ドットコム Advent Calendar 2025 の 15 日目の記事です。
- はじめに
- シャッフルランチとは
- 「シャッフル」できているのか問題
- ランダムさ(Randomness)の正体
- 数学的構造・アルゴリズム
- 現代数学の壁:社会的ゴルファー問題
- 結論:シャッフルランチ問題の提案
- 結び
はじめに
はじめまして。税理士ドットコム開発部所属エンジニアの金子です。
この記事では、弊社の福利厚生制度のひとつである「シャッフルランチ」を紹介するついでに、数学的・アルゴリズム的な困難さを背景とするその制度設計の難しさについて書いてみます。
シャッフルランチとは
シャッフルランチ(およびシャッフルディナー)とは、社員同士の所属部署を越えたコミュニケーションを推進するために、参加希望者がグループを作ってランチ(ディナー)に行く制度です。 会社による費用補助のもと、全従業員が毎月 1 回参加できる制度として運営されています。
要するに、「会社のお金で美味しいご飯を食べに行って、ついでに仲良くなろう」 という、全社員が諸手を挙げて喜ぶ制度ですね。
私は 2025 年 4 月の入社以来、欠かさずシャッフルディナーに参加しており、コーポレート部門や他事業部の方々と食べたり飲んだりを楽しませてもらっています。 (なおディナーは楽しすぎて指定の予算を超えてしまうため、福利厚生と言いつつ毎度のように個人の財布から超過した分を散財することになります)
「シャッフル」できているのか問題
シャッフルランチ・ディナーへの参加は、アンケートに参加意思を表明すると運営によって 4 人グループが作成される仕組みです。
しかし、特にシャッフルディナーは参加希望者数がランチほど多くないため、いわゆる「いつメン」での参加になりがちです。 お酒が入るディナー時には「また一緒になりましたね」「3 か月連続じゃないですか?」「本当にシャッフルされているんですかね(笑)」といった軽口も交わされます。
もちろん、実際にはランダム生成の結果でしょう。しかし、本制度の目的は「普段あまり交流しない社員とのコミュニケーション」です。 理想としては「はじめまして」や「お久しぶりですね」といった会話が自然発生する状態を作りたい。
そこで私は思いました。 「エンジニアとして、真の"シャッフル感"を定義し、実現方法を考えるべきではないか?」 と。
ランダムさ(Randomness)の正体
「シャッフルされていない」という声。これに対してエンジニアがログを調査すれば、おそらく「正常にランダム生成されています」という結論になるでしょう。バグではなく仕様だと。
では、なぜ「シャッフルされていない」と感じるのか。 それは、「数学的なランダム」と「人間が期待するシャッフル(バラつき)」は異なっている からです。
「ランダム」は「均等」ではない
このパラドックスを説明するのによく使われるのが、音楽プレイヤーの「シャッフル再生」の話です。 かつて Apple の iTunes などでも「シャッフル再生なのに同じアーティストの曲が連続して流れる」というクレームが多発したそうです。
しかし、確率論の世界では、「連続して同じ数値が出る」こともまた正当なランダムの結果 です。 コインを投げて「表」が出たからといって、次は「裏」が出やすくなるわけではありません(独立試行)。そのため、完全にランダムに選べば、当然「A さん・B さん」のペアが連続する確率もゼロではないのです。
私たちの直感はランダムを誤解する(クラスター錯覚)
人間は、この「偶然の偏り」に不自然さを感じます。
私が学生の頃に(被験者として)行った実験があります。人間に「コインを 100 回投げた結果を想像して書いてください」と指示すると、多くの人は「表」と「裏」が頻繁に入れ替わる、綺麗な「50:50」に近い並びを作ってしまいます。複数人による想像の結果を集計しヒストグラムにまとめると「50:50」付近に鋭いピークが生じます。 しかし、実際のコイン投げ(二項分布)では「表表表表表」のように同じ面が 5〜6 回続くことは決して珍しくありません。複数回実験してみると「50:50」に過度に集中せず自然なばらつきが生じます。
人間は、この「自然発生する偏り(クラスター)」を見ると「作為的だ」「ランダムじゃない」と誤認してしまいます(クラスター錯覚)。 つまり「完全にランダムに選ぶ」という手続きの仕様そのものが、我々の認知バイアスと相性が悪いのです。
ゲーム開発に見る「気持ちいいランダム」
この「確率の偏りに対する人間のストレス」は、ユーザー体験(UX)を重視するゲーム開発の世界では常識であり、「意図的に確率を操作する」 ことで解決されてきました。
テトリス: 完全にランダムにブロック(テトリミノ)を落とすと「I 字棒」がいつまでも来ない事態が発生し得ます。その事態を避けるため「全 7 種類を 1 セットとしてランダム順に出す(7 種巡回)」という、作為的なアルゴリズムが近年のテトリスでは採用されています。 ※参考: Tetris Wiki - Random Generator
ファイアーエムブレム: 「実効命中率」としてファンの間で知られる一部シリーズでの仕様です。例えば表示が 90%の場合、内部的には 98%程度の確率で当たるように補正されていると言われています(この検証自体も大変で、丁寧な仮説検定が必要です)。人間が直感的に感じる「90%ならほぼ当たる(10%ならほぼ当たらない)」という感覚にシステム側を寄せることで、推しキャラの予期せぬロストという悲劇からプレイヤーを守っているのです。
これらは決してズルではなく、ユーザー体験をより良いものにするための「おもてなし」「アイデア」です。
我々に必要なのは「作為」である
シャッフルランチに話を戻しましょう。
我々が求めているのは、数学的に正しい Random.shuffle() ではありません。
「過去に一度も会ったことがない人とマッチングし、かつ毎回新鮮な顔ぶれである」と人間が錯覚できるような、作為的な介入(ArtificialRandom.shuffle()) なのです。
「ランダム」という言葉の呪縛を解いたところで、いよいよ「シャッフル」を実現するアルゴリズムの設計に入りましょう。
数学的構造・アルゴリズム
では、これを技術的に解決するにはどうすればいいでしょうか。 まずは問題を数学の言葉(グラフ理論)に翻訳してみます。
グラフ理論によるモデル化
社員を「点(ノード)」、過去の同席回数を「線(エッジ)」と考えます。 これまで何度も食事に行ったペアは線が太く(重みが大きく)、初対面のペアは線がありません(重みゼロ)。
私たちのゴールは、この複雑に絡み合った網の中から、4 つの点を 1 セットとして切り出し、「切り出されたグループ内の線の太さの合計」を最小にすること です。
2人組なら「単純な交換」で解決できるが......
もし、シャッフルランチが「2 人 1 組(ペア)」で良いなら話はとてもシンプルです。 なぜなら、「悪いペア同士を交換(スワップ)すれば、必ず状況が良くなる」 からです。
想像してみてください。ここに「何度も同じペアになった A・B」と「何度も同じペアになった C・D」がいます。 この場合、単純にパートナーを入れ替えて「A・C ペア」と「B・D ペア」を作ってみればいいのです。
- 交換前より合計コストが下がった? → 採用
- 上がってしまった? → 不採用(元に戻す)
これを繰り返していけば、パズルのピースがハマるように、全員が自然と最適な相手に落ち着きます。これは専門用語では「山登り法」 などと呼ばれるものです。
ではシャッフルランチの制度を変更して 2 人ペアを作るようにすれば良いかといえば、そうではありません。 なぜなら、ほとんどの人は職場の初対面の人物とサシでご飯/飲みに行きたくはないからです。 この制度では、シャッフルランチ制度の存続すら危ぶまれてしまうでしょう。 複数人での交流により生まれる化学反応も期待すると、やはり現行の 4 人グループは維持したいところです。
4人組の壁:「局所最適解」の罠
しかし、4 人グループの場合、この「良くなるときだけ交換する」という単純な方針(山登り法)ではうまくいきません。 なぜなら、単純に良さそうな交換を繰り返すだけでは、「これ以上どう動かしても、誰かが不幸になる」という袋小路(局所最適解) にすぐハマってしまうからです。
シャッフルランチの 4 人組はまさにこれで、6 本の人間関係(A-B, A-C...)は複雑に絡み合っています。 「A さんにとっては初対面ばかりだが、B さんにとっては顔馴染みばかり」というトレードオフが至るところ、場合によってはすべてのグループで発生し得ます。 全体としてはもっと良い組み合わせがあるはずなのに、目先の「改善」だけを求めていると、そこへ辿り着けず手詰まりになってしまうのです。
解決策:焼きなまし法(Simulated Annealing)
この袋小路から脱出するために使うのが、焼きなまし法(Simulated Annealing) です。 これは、金属を高温で熱して徐々に冷やすと、内部の結晶構造が綺麗に整うプロセスを模倣したアルゴリズムです。
加熱(高温状態): 最初はランダムにメンバーを交換します。このとき、「改悪(エネルギーが増える)」となる交換も高確率で許容 します。 「えっ、悪くなるのに?」と思うかもしれませんが、これにより袋小路から無理やり脱出し、盤面をガシャガシャとかき混ぜることができます(熱ゆらぎ)。
冷却(徐々に温度を下げる): 計算が進むにつれて、徐々に「改悪」を許す確率を下げていきます。最後の方は「改善」のみを受け入れるようになります。
このように「最初は大胆に、最後は慎重に」探索することで、局所的な罠を抜け出し理論上の全体最適解(ベスト・シャッフル) へと着地できるのです。
現代数学の壁:社会的ゴルファー問題
焼きなまし法のアプローチを考えたところで、 この「参加者同士の重複を最小化するグループ分けを行いたい」という問題に先行研究がないかを調べてみることにしました。
調査を進めると、1 つの有名な難問に行き当たりました。 社会的ゴルファー問題(Social Golfer Problem) です。
組合せデザイン(Combinatorial Design)の分野で議論されているこの問題は、以下のように定義されます。
社会的ゴルファー問題 (SGP)
人のゴルファーが週に1回、
人ごとのグループ(
)に分かれてプレーする。
週間にわたり、どの2人も同じグループになる回数が最大1回(あるいは0回) となるようなスケジュールを構築できるか?
単純な数式では解けない
もし、弊社のシャッフルランチが「固定メンバーで毎回全員参加」であると仮定して単純化すれば、我々が直面しているのはこの SGP そのものです。
しかし、この問題の厄介な点は、「任意の人数に対して、スケジュールを構築する一般的な公式(構成法)がまだ発見されていない」 ということです。 特定の条件下では解法が見つかっているようですが、すべてのケースに対応できる魔法の数式(一般解)は、数学界でも未解決問題 とされています。
我々の問題はさらに「動的」である
さらに、現実のシャッフルランチは SGP とは微妙に条件が異なります。 SGP は「固定メンバーの長期スケジュールを静的(Static) に決める」問題ですが、我々のランチは「毎回参加者が変動する中で、動的(Dynamic) に次の一手を決める」必要があるからです。
厳密な「重複なし」を目指す SGP に対し、我々の問題は「直近の重複を最小化する」という、より制約を緩和した貪欲法(Greedy) に近いアプローチが許されます。
SGP は数学的な未解決領域ですが、我々の直面しているこの問題ならば、先ほどの「焼きなまし法」をはじめとするエンジニアリングの力で、十分に実用的な解を導き出せそうです。
結論:シャッフルランチ問題の提案
ここまで、ランチ(ディナー)の班決めについて長々と考察してきました。
社会的ゴルファー問題(SGP)は「未来の全スケジュールを静的に決める」問題ですが、我々の直面している現実は「参加者が毎回変動する中で、次の一手を動的に決める」という、よりライブ感のある問題です。
私はこの、SGP の制約を緩和した動的なバージョンを、ここに 「シャッフルランチ問題(Shuffle Lunch Problem)」 と名付けさせてもらいます。
結び
今後も「あれ、また一緒ですね」という偶然(クラスター)は発生し続けるでしょう。 しかし、そんな「局所最適解」に陥ったとしても、美味しいご飯を食べながら「確率の偏り」について語り合ったり考えたりする時間は、それはそれで楽しいものです。
より良い「シャッフルランチ」を実現したい方は、私に代わって 「シャッフルランチ問題」 を解いていただけると嬉しいです。