有史以来の難題
結婚式の席順、葬式の花輪の位置、映画のスタッフロールにおける役者名の出現順で思わぬ齟齬をきたすことがあります。
クラス会など平らな組織でなく様々な世代や役職が集まっているときは、特に頭を悩ませます。
思い通りでなかった場合は、運営側の意図がそこに色濃く表現されていると理解するのが妥当です。
納得のいく決め方
同じランクにある集団の順番を決めるには、くじ利用が一般化しています。参加者ぶんのくじを抽選箱に入れ、ガラガラポンとかき混ぜてランダムにくじを引いてもらいます。
確率的にはくじを引く順番は無関係ですが、気分的に最初に引きたいという要望を聞き入れて、くじを引く順番をくじ引きで決めてから本番のくじを引くことが多いです。
電子くじ引きの採用
プロ野球のドラフト会議では上に示したオーソドックスな方法を採用しています。当ブログでも電子式くじの引き方や抽選法について以下のページで取り上げています。
①2016の運勢
②あみだくじ作成法
③電子式福引き管理ソフト封切
ここでは席順を決めるための簡単な電子くじ引きについて考えてみます。準備や手順は以下のようになります。
①受付で受付順番号を発行し参加者と関連付け、受付順番号を参加者に通知する。
②受付順番号を一つ上げ、次の参加者に引き当てる。
③締め切り時間になったら、出席者一覧表を作成する。
④乱数を用いて席順を決め席順表を作成する。
プログラミングの準備
①二次元配列を作り、一次元要素に乱数を作成する。
②乱数値の小さい順に並べ替える。ソートする。
様々なプログラミング言語において整数値は-2147483648から2147483647まで扱えるものが多いです。
扱う数値が大きくない場合は、図のように変数を上位部と下位部に分けて利用すると二次元配列を使わないで、処理が可能になります。図は一つの32ビット変数を2用途に使い分けています。
IDは受付番号に、IDデータは乱数値に用います。
32ビット全体の値を較べて、小さい順に並べ替えた後に、IDを取り出します。それには255と論理積演算(AND)で算出します。JavaScriptではAND演算はまだ不明ですがなぜか思い通りの結果にならないので、256による剰余(モジュロ)演算で代替します。
実行例とプログラムコード
開始ボタンをクリックするたびに、席順が変化します。プログラムコードは右クリックで見ることができます。
並べ替えの探求
Sorting