ゲームで使える!4人チームをランダムに作るブラウザツールを作ってみた

AI・テクノロジー

ゲーム仲間と集まって遊ぶときに毎回頭を悩ませるのが「どうやってチームを分けるか」です。
じゃんけんで決めるのもありだし、リーダーを決めて交互にメンバーを選ぶのもあり。でも人数が多いとそれだけで時間がかかってしまうし、同じ人ばかりが組んでしまうこともあって、どうしても不公平感が残ります。

「もっと公平に、しかもサクッとチーム分けできたら便利なのに…」
そんな思いから、ブラウザ上で動くグループ分けツールを自作してみました。ChatGPTを活用してコードを書き、試行錯誤しながら改善していったので、その過程をまとめてみます。

最初はシンプルに「ランダムシャッフル」

 

どこでも使えるようにしようと思いhtmlで動くランダムアプリを作ろうと思いました。
作成する画面のイメージは参加者リストをテキストボックスに入力して、JavaScriptの Math.random() を使ってシャッフル。それを4人ずつ区切ってグループを作る、という方法です。

ただ、実際に何度か試してみると問題が出てきました。
短時間で何度も「グループ分け」ボタンを押すと、ほぼ同じ組み合わせが出てきてしまうのです。
これでは実用性にほど遠いです。

偏りをなくすには「シード」を工夫する

そこで調べてみると、乱数には「シード値」と呼ばれる初期値があることを知りました。
Math.random() は便利ですが、短い間隔で実行すると結果が似やすいらしい。

ならば、自分でシードを作って乱数をコントロールしてしまえばいい。

ここで役に立ったのがChatGPTです。
「シードを指定して乱数を作る方法を教えて」と聞いてみると、
**線形合同法(Linear Congruential Generator, LCG)**
を使ったサンプルコードを出してくれました。これを組み込めば、自分で好きなシードを設定して乱数を作れるようになります。

円周率100桁を乱数に利用する発想

シードをどう作るかが次の課題です。そこで思いついたのが、円周率の小数点以下100桁を使う方法でした。
やり方はこうです。

  1. あらかじめ円周率100桁を文字列として用意しておく

  2. その中からランダムに4桁を切り出す

  3. それに現在の時刻(ミリ秒)を足してシード値を作る

  4. そのシードを使って乱数を生成する

こうすることで「時間+円周率」という2つの要素が組み合わさり、毎回違う結果を作りやすくなります。

使った計算式は以下になります

<script>
const PI100 = “14159265358979323846264338327950288419716939937510” +
“58209749445923078164062862089986280348253421170679”;
function seededRandomGenerator(seed) {
let value = seed % 2147483647;
if (value <= 0) value += 2147483646;
return function() {
value = value * 16807 % 2147483647;
return (value – 1) / 2147483646;
};
}
実際に試してみた結果
毎回グループ分けに苦労していた時間が短縮されボタン一つでグループ分けができる世になったのでとても助かっています。

今後の改善ポイント

作ってみると、「ここをもっと便利にしたいな」という部分も出てきました。

  • 人数を自由に設定できるようにする(今回は4人固定)

  • 抽選中にアニメーションを入れて演出を楽しむ

  • 結果を履歴として保存し、同じ組み合わせを避ける

  • スマホ対応UIにして現場で使いやすくする

実際、今回作ったツールはまだ「ベース」なので、使うシーンに合わせてカスタマイズできればもっと面白くなりそうです。

まとめ

「ゲームで4人1組のグループをランダムに作りたい」というシンプルな発想から始まり、最初は偏りだらけの乱数に悩まされました。
そこからシードの工夫にたどり着き、円周率100桁と現在時刻を掛け合わせる方法で、よりバラけたチーム分けができるようになりました。

難しい数式や高度なアルゴリズムを知らなくても、ChatGPTを活用すればここまで作れるのは正直驚きです。

もし同じように「チーム分けで盛り上がりたい」と思っている人がいたら、ぜひこの方法を試してみてください。

コメント

タイトルとURLをコピーしました