透明性の高い電子くじ引き手法

2023/11/12 T. Hirano

1. はじめに

 電子化、オンラインが普及したが、くじ引きも同様に電子化、オンライン化したい(現地に行ってくじを引くのは時代にそぐわない)。そこで、透明性高く電子的にくじ引きを行う方法について説明する。
 アルゴリズム的には公平にくじ引きを行うアルゴリズムを提供することは簡単であるが、透明性が高い、すなわち、関係者から見て全体の手順が見えて不正が入っていないことを確認できることが重要である。プログラム化してブラックボックス化してしまった場合にはバグが入る可能性もあり、不正なルーチンが入っているかもしれないという疑念も生じる。
 本文書で説明する方法は単純ではあるが、ブラックボックス化されたアルゴリズム・プログラムのバグ(たとえアルゴルズムとプログラムを公開していても自動化したシステムを作った時点でブラックボックス化されてしまう)について疑念が生じない透明性の高い手法である。

2. 電子くじ引きの手順

種値(乱数の初期値)を用いる乱数系列を使用する。(種値は場合によっては関係者で見ていれば使わなくても良いが、種値を使うと再現性がある。)

以下では管理者(1名でも可)と関係者(管理者を含み、くじ引きをする人)に分ける。手順は以下のようになる。

(1) 管理者は期限を決めて関係者から乱数の種値(例えば、0-99の整数値)をメール等で収集する。最終的に使う種値は全員の種値の和(積でも他の関数でも良いが)を取ったものと連絡しておく。このとき、管理者が不正(制御)できないように管理者は自分の種値をメール等で最初に関係者に連絡しておく。
(2) 関係者は管理者に自分が選んだ種値を管理者のみにメール等で連絡する。関係者が全関係者に連絡すると後の人がくじを制御できる可能性があるからである(乱数系列なので制御はしにくいが)。
(3) 期限になったら、各関係者から連絡があった種値を関係者全員に公開する(これにより、各関係者は自分の投票が有効であることを確認できる)。そして、種値の和を計算し、付録のプログラム等(これも事前に公開しておく)を用いて優先順位を決定する。念のため、この作業はオンラインで集まって作業画面を見ているとよい(もし、プログラムのバージョン等を指定して再現性が確保できるならばオンライン会議で集まる必要もない)。

3. MATLABプログラム例

elottery.m

%--------------------------------
% E Lottery Program
% by Takuichi Hirano
% Language: MATLAB
%--------------------------------
clear; clc; % 履歴クリア; コマンドラインクリア
seed=2; % 種値(この値を投票で制御する)
rng(seed); % 種値の設定
n=11; % 1-nの乱数を生成
nraw=n*10; ncol=1; % 発生する乱数の行列サイズ(乱数系列が運悪く同じ値を出してしまったときはn*10の値を増やす)
rndlis=randi(n,nraw,ncol); % nraw個の
rndlis2=unique(rndlis,'stable') % 重複行を削除
writematrix(rndlis2,'rndlis.csv')

実行例

rndlis2 =

5
1
7
4
3
6
2
9
10
8
11

6. おわりに

以上、業務効率化にお役立てください。

PDF Document: e_lottery_method.pdf


Back