ゲーム仲間と集まって遊ぶときに毎回頭を悩ませるのが「どうやってチームを分けるか」です。
じゃんけんで決めるのもありだし、リーダーを決めて交互にメンバーを選ぶのもあり。でも人数が多いとそれだけで時間がかかってしまうし、同じ人ばかりが組んでしまうこともあって、どうしても不公平感が残ります。
「もっと公平に、しかもサクッとチーム分けできたら便利なのに…」
そんな思いから、ブラウザ上で動くグループ分けツールを自作してみました。ChatGPTを活用してコードを書き、試行錯誤しながら改善していったので、その過程をまとめてみます。
最初はシンプルに「ランダムシャッフル」
どこでも使えるようにしようと思いhtmlで動くランダムアプリを作ろうと思いました。
作成する画面のイメージは参加者リストをテキストボックスに入力して、JavaScriptの Math.random()
を使ってシャッフル。それを4人ずつ区切ってグループを作る、という方法です。
ただ、実際に何度か試してみると問題が出てきました。
短時間で何度も「グループ分け」ボタンを押すと、ほぼ同じ組み合わせが出てきてしまうのです。
これでは実用性にほど遠いです。
偏りをなくすには「シード」を工夫する
そこで調べてみると、乱数には「シード値」と呼ばれる初期値があることを知りました。Math.random()
は便利ですが、短い間隔で実行すると結果が似やすいらしい。
ならば、自分でシードを作って乱数をコントロールしてしまえばいい。
ここで役に立ったのがChatGPTです。
「シードを指定して乱数を作る方法を教えて」と聞いてみると、
**線形合同法(Linear Congruential Generator, LCG)**
を使ったサンプルコードを出してくれました。これを組み込めば、自分で好きなシードを設定して乱数を作れるようになります。
円周率100桁を乱数に利用する発想
シードをどう作るかが次の課題です。そこで思いついたのが、円周率の小数点以下100桁を使う方法でした。
やり方はこうです。
-
あらかじめ円周率100桁を文字列として用意しておく
-
その中からランダムに4桁を切り出す
-
それに現在の時刻(ミリ秒)を足してシード値を作る
-
そのシードを使って乱数を生成する
こうすることで「時間+円周率」という2つの要素が組み合わさり、毎回違う結果を作りやすくなります。
使った計算式は以下になります
const PI100 = “14159265358979323846264338327950288419716939937510” +
“58209749445923078164062862089986280348253421170679”;
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を活用すればここまで作れるのは正直驚きです。
もし同じように「チーム分けで盛り上がりたい」と思っている人がいたら、ぜひこの方法を試してみてください。
コメント