2007年6月23日

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 は買わない。買ったこともない。ああ、イヤな奴・・・と早合点してはいけない。明日は久々に宝塚記念の馬券を買いに行こうかと思っている (笑)。

2007年5月20日

サッカーくじ toto BIG のキャリーオーバーの本質

最高6億円が当たるという toto BIG は、キャリーオーバーが約15億円あることから話題となって、昨日 (5月19日) 締め切りの第278回では過去最高の約61億円の売り上げを記録した。なるほど、キャリーオーバーも売り上げも少ない時は、たとえば宝くじ (還元率46.3%) などと比べても、toto BIG は分が悪すぎるくじである。

特に、キャリーオーバー (加算金) が完全に0の時は、売り上げがいくら大きくても、当たった口数がいくら少なくても、当せん金の上限は3億円となってしまう。

(払戻金)
第12条
1口当たりの払戻金は、関係法令に定めるところにより、スポーツ振興投票の類型ごとかつ第5条第1項による指定試合の数及び指定試合の組ごとに、売上金額の50%に相当する額を、センターがあらかじめ定める率に応じて各等ごとに配分し、それらの金額にそれぞれ次条による加算金を加えた金額(以下「配分金額」といいます。)を、各等ごとに合致した投票口数であん分した金額となります。
2 「toto」の1口当たりの払戻金の最高限度額は、第5条第1項による指定試合の数が14の場合は、一等は3億円(一等に加算金がある場合は6億円)
(以下略)

(toto約款より引用)

toto BIG の本来の還元率は50%、つまり、毎回の売り上げの50%が当せん金に配分される。そのうち40%が1等、10%が2~4等に配分される。また、toto BIG において、各試合の勝ち、負け、引き分けのいずれかの指定は、くじ販売時にランダムに指定されるため、人的な予想を行う従来の toto と違い、1試合あたりの当たる確率は常に3分の1となる。指定試合が14試合なら、1等 (指定試合の勝ち、負け、引き分けがすべて的中) が当たる確率は、3の14乗 (478万2969) 分の1となる。toto BIG は1口300円であるから、1等の当せん金の期待値は本来、300×4782969×40% = 5億7395万6280円 となるべきである。

しかし、キャリーオーバーが0であれば、前述のように、その回の売り上げがいくら大きくても3億円が最高限度額となり、差額は次回へのキャリーオーバーとなる。実質的な還元率は約31%まで落ち込んでしまう (売り上げが少なければ3億円すら配分できないためさらに低下する)。「キャリーオーバーがたくさんある今こそチャンス!」というようなあちこちの煽りとは裏腹に、そもそも、キャリーオーバーが0では分が悪すぎる公営ギャンブルなのである。

なお、toto約款を素直に解釈すると、キャリーオーバーが1円でもあれば、売り上げと当せん口数次第では1等6億円が生じる可能性はある。

ただし、今回ほどには人気が沸騰していなかった回の売り上げは、たとえば今シーズン最初の第261回 (3月3~4日) は1億2618万3900円 (42万0613口) にとどまっている。とりあえず1等が1口だけ出た (自分だけ当たった) 場合に備え、最低でもキャリーオーバーが6億近くないと、「買えない」くじだということになる。

逆に、今回 (第278回) のように61億2033万1500円 (2040万1105口) の売り上げがあれば、そのうちの40% (24億円強) が1等に配分されるから、1等の当せん口数が4口までなら、キャリーオーバーを取り崩さなくても6億円を各口に配分できる。そして、1等の当たる確率は約480万分の1だから、1等の当せん口数の期待値は4口強といったところである。試しにプログラムを作成して確率計算してみたところ、今回の1等の当せん口数が4口以内に収まる確率は57.4%ある。

つまり、売り上げが十分大きければ、キャリーオーバーなど、あまり意味がないのである。こうした制度は、toto BIG の売り上げが低迷していることを前提として、6億円という最高限度額と組み合わせ、本来の1等当せん金の期待値である5億7395万6280円に近い値へ平準化させるための方策だったわけである。

しかし、キャリーオーバーが底をついて0円となった途端、平準化どころか、極端に分の悪いくじへと toto BIG は化けてしまう。ちなみに、今回のキャリーオーバーは15億円弱で、合計約39億円が配分可能だから、当せん口数が7口以上ならば、次回へのキャリーオーバーは0となり、次回の1等当せん金の最高限度額は3億円となってしまう。先のプログラムの計算では、今回の当せん口数が7口以上となる確率は14.2%ある。

ここで、

キャリーオーバー発生時の最高限度額 (6億円) > 本来の1等当せん金の期待値 (5億7395万6280円)

という不等式が僅差ながら成り立つことに注意してほしい。キャリーオーバーがずっと残っているということがないように制度設計されている。それはよい。

しかし、キャリーオーバーが0の回は、次回以降への寄付みたいなくじとなってしまう (笑)。次回にせよ、次々回以降にせよ、計算上、そのうち一旦はキャリーオーバーが0となる時が来る。その時にどのような反応が起こるか、少々興味深いところではある。

・・・と書いているうちに、今回の結果が発表された。1等は7口、つまり、次回へのキャリーオーバーは0である・・・

追記

1等当せん金の期待値早見表を別記事に掲載した (6月23日)。

最近の記事

最近のトラックバック

Powered by Blogzine[ブログ人]
ブログ人登録 2008年03月15日