あまりに訳が分からなかったので、私は、乱数を使ったとても単純なシミュレーションで、合衆国大統領選挙の性質を理解してみようと考えました。私には、大統領選の数式モデルを考える頭脳も時間もないので、いつでも、このような力づくのシミュレーションをやるのが常です。
今回は、このようなプログラムを作って、「米国の各州の住人(未成年や公民権が停止中の人も含めて)、約3億人の人間を、投票率100%で、クリントンさん、トランプさんのいずれかに、ランダムに投票する」というシミュレーションを実施しました(2016年の実際の有権者登録数は、1億1943万人です)。
また、本来のシミュレーションであれば、地盤州(ほっといても勝てる州)の選挙人を定数として、激戦州(スイング・ステート)の選挙人だけを変動対象にしてシミュレーションすべきなのでしょうが、今回の目的は「選挙の性質を理解する」ことなので、あえて、米国の全州(コロンビア特別区を含む)を、スイング・ステートとして取り扱うことにしました。
とはいえ、3億人分の投票は私のPCでも大変だったようで、1回の選挙に約5秒間を必要としました。
また、この「デタラメに投票する」を作るために、当初C/C++言語が標準実装している乱数の関数(rand())を使ったのですが、3億人を相手にするシミュレーションでは精度が悪すぎて(2の31乗 = 21億回くらいで乱数が循環してしまう)、変な結果(例えば、「クリントンさんが不利な状況のシミュレーションで、クリントンさんが全勝する」など)が出てきてしまったので、乱数に関しては精度の高いものを組み込むことにしました(参考)。
さて、このシミュレーションでは、投票者は「ランダムな(デタラメな)投票」をするので、普通に考えたら、選挙の結果は、クリントンさん、トランプさんが、勝ったり負けたりして、勝率50%となり、選挙人の総数も、270人±10人程度に納まるだろう、と予想していました。ところが、何回シミュレーションをし直しても、私の予想を超える結果(選挙人数)になってしまうのです。
例えば、ある乱数初期値では、クリントンさんが400人を取り、トランプさんが138人になることもあれば、その逆のパターンも何度も出てくるのです。
バグ? とも思ったのですが、このシミュレーションプログラムが、アホみたいに単純(main()の行数20行くらい)なものなので、バグとも思えませんでした。
そこで、私は、自宅のPCで、
―― 「合衆国大統領選挙、連続1万回シミュレーション」
を強行しました。
シミュレーション結果の平均値が一定であれば、バグではないという確信が持てると思ったからです。ただ、今回のシミュレーションは1回につき5秒かかるので、1万回繰り返せば5万秒、つまり約14時間かかります。今月の江端家の電気代は、結構な金額になるだとうと腹をくくっております。
それでは、江端家の電気代と引き換えに算出した計算結果を以下に示します。確かに、バグではなかったようですが、江端家のPCは、バグよりも驚くべき結果を私に見せつけたのです。
信じられないかもしれませんが、1万回の選挙の、クリントンさんと、トランプさんへの投票数は、ほぼ正確に50.00%(最大値50.0102%、最小値49.9987%、標準偏差0.0028%)といえるものです。
にもかかわらず、乱数を使った同じシミュレーションで、これだけのバラバラな結果が出てくることは、私のこれまでの統計計算の常識を超えていました。
Copyright © ITmedia, Inc. All Rights Reserved.