toto BIG 1等当せん金期待値早見表 ~夢はいつ買うべきか~
まず、説明は抜きにして、サッカーくじ toto (トト) の BIG (ビッグ) を1口だけ買って1等が当たった場合の当せん金の期待値を、以下の表に示す。
| キャリーオーバー (円) | |||||||||
| 0 | 1 | 3億 | 6億 | 9億 | 12億 | 15億 | 18億 | ||
| 投票口数 | 20万 | 23,505,144 | 23,505,144 | 317,319,437 | 588,116,595 | 594,216,682 | 599,835,541 | 599,920,268 | 599,998,288 | 
| 50万 | 56,970,362 | 56,970,363 | 341,822,172 | 572,629,515 | 587,258,987 | 599,063,625 | 599,568,928 | 599,975,798 | |
| 100万 | 108,285,899 | 108,285,900 | 379,000,648 | 552,355,267 | 579,669,694 | 596,806,336 | 598,676,302 | 599,836,962 | |
| 200万 | 196,141,957 | 196,141,958 | 441,319,403 | 528,513,637 | 576,212,069 | 590,880,145 | 597,290,632 | 599,097,239 | |
| 500万 | 266,708,500 | 372,176,415 | 452,796,707 | 533,417,000 | 558,910,489 | 584,403,979 | 590,688,063 | 596,972,148 | |
| 1000万 | 287,249,376 | 428,862,098 | 478,777,768 | 528,693,439 | 551,596,096 | 574,498,753 | 583,282,035 | 592,065,318 | |
| 2000万 | 296,848,019 | 472,658,838 | 501,828,388 | 530,997,938 | 548,492,243 | 565,986,548 | 575,344,173 | 584,701,799 | |
| 5000万 | 299,862,642 | 513,347,689 | 526,937,252 | 540,526,815 | 550,738,214 | 560,949,614 | 568,218,138 | 575,486,663 | |
| 1億0000万 | 299,998,191 | 534,185,092 | 541,660,716 | 549,136,339 | 555,367,999 | 561,599,660 | 566,649,131 | 571,698,602 | |
縦軸はくじの投票口数 (販売口数)、横軸は前回からのキャリーオーバー (繰越金) である。この二つが、1等当せん金の期待値を決める要素である。
プログラムを自作して計算した。計算途中の誤差があるかもしれないし、アルゴリズム自体が何か間違っているかもしれない。計算結果の正確性は保証しないので悪しからず (プログラムは後掲)。
背景が緑色のところは、1等当せん金の本来の期待値 (5億7395万6280円) を上回っていることを示す。本来の期待値は、
300 (1口の価格) × 4782969 (勝ち、負け、引き分け14試合分、つまり3の14乗) × 40% (1等への還元率) = 573956280
として求められる。この緑色のゾーンの時が、1等当せん金において平均よりも分が良いことになる。念のため、あくまで平均よりは分が良いというだけであって、収支の期待値は常にマイナスとなるのでご注意を。1等のキャリーオーバーがいくら多くても、くじの実質的な還元率は最大で約51.8%にとどまる (このことについては後述)。
逆に、背景がピンク色のところは、本来の期待値の95% (5億4525万8466円) を下回っていることを示す。1等当せん金において平均よりも5%以上分が悪いということになる。
ちなみに、まもなく (6月23日昼に) 締め切られる第286回のくじでは、投票口数が360万口くらいになりそうで、キャリーオーバーは8億0979万2160円となっている。早見表においては、分の良し悪しの境目に位置する。360万口としてプログラムで計算してみると、1等当せん金の期待値は約5億6283万円となり、若干分が悪い (緑色でもピンク色でもない) 範囲内となる。なお、大フィーバーとなった先日の第278回では、投票口数は2040万1105口、キャリーオーバーは14億9379万7800円で、計算してみると1等当せん金の期待値は5億7492万9888円となる。早見表においては、ほんの少しだけ平均よりも分が良い (緑色の) 範囲内となる。
この表の注意点を以下記す。
- キャリーオーバー (繰越金) が0の時の1等当せん金の上限は3億円、キャリーオーバーが発生している時の上限は6億円となるため、0円と1円を分けて表に示している。この事情については先月の記事を参照されたい。
 - 「1口だけ買って」と断っているのは、たとえば一人で100万口を買ったうちの1口が当たった場合や、一人で2口以上当たった場合とは、計算が異なるからである。1口だけ買って1等が当たった場合の当せん金期待値は、その1口以外に何口の1等当せんがあるか、その確率分布によって求められる。実際問題として、10口や100口買った程度なら、計算結果にはあまり影響しないので気にする必要はない。
 - 計算の最終結果については、小数点未満を四捨五入している。計算途中については、当せん口数に対応する1等当せん金の算出は小数点未満を切り捨て (toto BIG のルールにより)、それ以外の確率計算は64ビット浮動小数をそのまま使用している。
 - 2等以下の還元率を10%固定とみなした場合のくじの実質的な還元率は、表中では50%以上が緑色、48%以下がピンク色となる。ただし、投票口数が少ない場合、特に100万口以下の場合は、約17万分の1の確率で当たる2等当せん金の期待値の変動が無視できなくなる。なお、実質的な還元率の最大値は約51.8%である「と言える」。これは、1等当せん金期待値を上限の6億円とし、2等以下の還元率10%固定とみなした場合に求められる数値である。
 
なお、キャリーオーバーが多い場合、投票口数が増えると、1等当せん金の期待値はいったん小さくなり、さらに投票口数が増えるとまた大きくなる。この現象は表中のキャリーオーバー6億~12億の縦枠でも確認できる。どうしてそうなるかというと、投票口数が増えると、当せん口数が多すぎてキャリーオーバーを使い切ってしまい当せん金が小さくなる確率がいったん上昇するためである。キャリーオーバーを無視できるぐらい投票口数が増えると、本来の1等当せん金期待値に近似すべく、再び期待値は大きくなる。
参考までに、計算に用いたプログラムを掲載する (言語は Java)。
/**
 * toto BIG 期待値計算クラス。
 * @author Motoyuki OGAWA
 */
public class TotoBig {
    /**
     * 1等当せん確率。
     */
    public static final double POSSIBILITY = 1 / Math.pow(3, 14);   
    
    /**
     * 一口の購入金額。
     */
    public static final int PRICE = 300;
    
    /**
     * 1等当せん金への還元率。
     */
    public static final double RETURN_RATE_OF_1STPRIZE = 0.4;
    
    /**
     * キャリーオーバー無しの場合の、1等当せん金の最大額。
     */
    public static final long MAX_1ST_PRIZE_WITHOUT_CARRYOVER = 300000000;
    
    /**
     * キャリーオーバー有りの場合の、1等当せん金の最大額。
     */
    public static final long MAX_1ST_PRIZE_WITH_CARRYOVER = 600000000;
    
    /**
     * 1口買った購入者から見た実質的な1等当せん金の期待値を計算する。
     * @param saleNumber 販売口数
     * @param carryover キャリーオーバー金額
     * @return 1等当せん金の期待値
     */
    public static double getExpectedReturnOf1stPrize(
            long saleNumber, long carryover) {
        
        long moneyReturn
                = (long) (PRICE * saleNumber * RETURN_RATE_OF_1STPRIZE) 
                  + carryover;
        
        double sum = 0;
        
        // 購入者の1口が1等に当たったとした上での、当せん口数ごとの計算、積算
        for (int i = 0; ; i++) {
            double tempPossibility
                    = getPossibilityOf1stPrize(saleNumber - 1, i);
            double tempReturnMoney = tempPossibility 
                    * get1stPrizeReturn(moneyReturn, i + 1, carryover);
            double averageNumber = saleNumber * POSSIBILITY;
            
            // 計算上無視できるほど i が大きくなれば計算打ち切り
            if (tempReturnMoney < 1.0e-2 && averageNumber < i) {
                break;
            }
            
            sum += tempReturnMoney;
        }
        return sum;
        
    }
    
    /**
     * 1等当せんが hitNumber で指定した口数だけ出る確率を取得する。
     * @param saleNumber 販売口数
     * @param hitNumber 当せん口数
     * @return 求める確率 (0 から 1 の範囲)
     */
    public static double getPossibilityOf1stPrize(
            long saleNumber, int hitNumber) {
        
        double tempPossibility = 1;
        
        for (int i = 1; i <= hitNumber; i++) {
            tempPossibility *= saleNumber - i + 1;
            tempPossibility /= i;
            tempPossibility *= POSSIBILITY;
        }
        for (int i = 1; i <= saleNumber - hitNumber; i++) {
            tempPossibility *= 1 - POSSIBILITY;
        }
        
        return tempPossibility;
    }
    
    /**
     * 一等の当せん金を計算して取得する。
     * キャリーオーバーが0の場合は最大3億円、そうでない場合は最大6億円となる。
     * 
     * @param totalMoneyReturn 一等当せん金の払戻総額 (売上の40%+キャリーオーバー)
     * @param hitNumber 当せん口数
     * @param carryover キャリーオーバー金額
     * @return 一等当せん金
     */
    public static long get1stPrizeReturn(
            long totalMoneyReturn, int hitNumber, long carryover) {
        
        long tempAmount; 
        
        if (hitNumber <= 0 || totalMoneyReturn <= 0) {
            return 0;
        }
        tempAmount = totalMoneyReturn / hitNumber; // 小数点未満切り捨て
        
        if (tempAmount < MAX_1ST_PRIZE_WITHOUT_CARRYOVER) {
            return tempAmount;
        } else if (carryover <= 0) {
            return MAX_1ST_PRIZE_WITHOUT_CARRYOVER;
        } else if (tempAmount < MAX_1ST_PRIZE_WITH_CARRYOVER) {
            return tempAmount;
        } else {
            return MAX_1ST_PRIZE_WITH_CARRYOVER;
        }
    }
    
    /**
     * メインメソッド。
     * キャリーオーバーと販売口数の組み合わせを用意して1等当せん金の期待値を計算する。
     * @param args 使用しない
     */
    public static void main(String[] args) {
        long[] numberArray =  {(long) 2e5, (long) 5e5, (long) 1e6, 
                               (long) 2e6, (long) 5e6, (long) 1e7,
                               (long) 2e7, (long) 5e7, (long) 1e8}; 
        long[] carryoverArray = {0, 1,
                                (long) 3e8, (long) 6e8, (long) 9e8, 
                                (long) 12e8, (long) 15e8, (long) 18e8}; 
        
        // CSV 形式で出力。
        for (int i = 0; i < numberArray.length; i++) {
            System.out.print(numberArray[i] + ",");
            for (int j = 0; j < carryoverArray.length; j++) {
                System.out.print(
                        + getExpectedReturnOf1stPrize(
                                numberArray[i], carryoverArray[j]) + ",");
            }
            System.out.println();
        }   
    }
}繰り返すが、このプログラムと計算結果の正確性は保証しないので悪しからず。ただし、もしも修正する必要が何か見つかれば可能な限り対応しようと思っている。なお、プログラムの掲載だけでなくアルゴリズムの説明もしようかと思ったが面倒くさいのでやめた。気が向いたらいつか説明したい・・・っていつだよ (笑)。
・・・というか、いろいろ計算するのもよいが、分が良い時でも実質的な還元率は50%を若干上回る程度であり、収支の期待値は常にマイナスである。貧乏人の射幸心をあおって、結局のところ格差の固定につながってしまうのが、ギャンブルというものである。金持ちは期待値がプラスな貯蓄や投資をしているのだから。赤字続きの天下り団体に寄付する気がないならば、買わないことをお勧めする次第である。
ギャンブルもディズニーランドと同じように夢を見るレジャーだし、レジャーの対価として本人が納得すればそれでよい、という考え方もあるだろう。基本的には私もそうである。ただし、今の私は計算してブログを書くことにレジャーとしての楽しみを見いだしているので、toto は買わない。買ったこともない。ああ、イヤな奴・・・と早合点してはいけない。明日は久々に宝塚記念の馬券を買いに行こうかと思っている (笑)。
これは参考になりました。キャリーオーバーは10億~20億程度以上ないとお得ではないんですね。
投稿 redpond | 2012年10月24日 12:46