宝くじの当選確率は数字を見ても実感しにくい。
それを体験できるWebアプリを作った。
本記事ではどれだけ当たらないかの数字と、アプリの機能・操作を整理する。
1. 宝くじが当たらない、その規模感
実在する高額宝くじの「1ユニット」は 20,000,000枚(2,000万枚)で構成される。
等級と本数の一例は以下のとおり。
| 等級 | 金額 | 本数 | 当選確率 |
|---|---|---|---|
| 1等 | 7億円 | 1 | 1 / 20,000,000 |
| 前後賞 | 1.5億円 | 2 | 1 / 10,000,000 |
| 2等 | 1,000万円 | 3 | 1 / 約666万 |
| 3等 | 100万円 | 100 | 1 / 200,000 |
| 4等 | 5万円 | 5,000 | 1 / 4,000 |
| 5等 | 3,000円 | 約200,000 | 1 / 100 |
| 末等 | 300円 | 約2,000,000 | 1 / 10 |
1枚300円なので、1ユニットすべて買うと 6,000,000,000円(60億円)の投資。
一方、全本数×金額の合計払戻はおよそ 26億円。 還元率は約43% で、買えば買うほど期待値ベースでは負ける構造になっている。
体感として分かりやすい数字を並べる。
- 1万枚(300万円分)を買っても、1等が当たる確率は 1/2,000。
- 末等(300円)は約1,000本当たり、約30万円の払戻。投資300万のうち戻るのは1割。
- 1等を狙うには平均して2,000万枚(60億円)必要、という乱暴な計算。
これを画面で示すのが本アプリ。
2. 機能
2,000万枚の券を敷き詰めた仮想空間
20列 × 20行 = 400エリアに分割し、各エリアに 250 × 200 = 50,000枚を配置する。合計 20,000,000枚。すべて Canvas で描画しており、DOM要素は生成しない。
最初に表示されるダイアログは「めくる/まとめ買い/1等を探す」の3アイコンと、開始ボタンだけのシンプル構成。
当選券のロジック
-
1等(1枚)と前後賞・2等・3等・4等の少数の上位等賞 は起動時に座標を確定して
Mapに保持。 - 5等(約1/100)と末等(約1/10) は座標ハッシュで判定し、200万件の座標を保持しない。
これで2,000万枚分の状態管理を軽量に行っている。
当たり券の見た目
ズームインすると、各券は横長のチケット風(オレンジ+ピンクの番号面+赤帯)で描画される。めくった結果は等級ごとに色分けし、★を中央に置く。
当選内訳パネル(右上)
ヘッダー右下ではなく、メイン領域の右上に常時表示する小型パネル。
各等級の図柄(凡例)と金額、現在の当選口数を一覧表示する。
0口の等級は薄く表示し、当選済みの行を引き立てる。
投資・払戻・損益の常時表示
ヘッダーに「枚数 / 投資 / 払戻 / 損益」を常時表示する。
損益は色分け(赤=損失、緑=利益)し、買うたびに小さく拡大するbumpアニメで変化を示す。
めくり演出(フリップ)
手動タップの1枚だけ、横回転(scaleX で1→0→1)でめくる。
爆買い(1万枚)は瞬時で、フリップ演出をかけない(無駄な負荷を発生させない)。
ホバー時のツールチップ
券にマウスを乗せると、その券が当たり券だった場合のみ、等級と金額をツールチップで表示する。
ハズレや券の隙間では出ない。
1等の場所を見る
ボタンを押すと、現在のカメラ位置から1等の座標へ滑らかにアニメーション移動(位置は ease-in-out、倍率は対数補間)。
たどり着くと金色の券と集中線が表示される。
1万枚まとめ買い(爆買い)
ランダムな座標で1万枚を一括購入する。
3,000,000円分。実行後、フッターに「当たり口数」と「払戻金額」が一時表示される。
LOD(Level of Detail)描画
ズームアウト時はエリア単位の塗りつぶしのみ、ズームイン時のみ個別の券を描画する。
広域でも個々の券を全部描こうとすると数百万回の描画コマンドになるので、カメラ倍率に応じて切り替える。
ブロックの色が黒に近づくほど、そのエリア内のめくり済み枚数が多いことを示す。
3. 操作方法
| 操作 | 方法 |
|---|---|
| 移動 | ドラッグ / スワイプ |
| 拡大・縮小 | マウスホイール / ピンチイン・アウト |
| 1枚めくる | 拡大した状態で券をタップ/クリック |
| まとめ買い | 「爆買い(1万枚)」ボタン |
| 1等の場所を見る | 「1等へジャンプ」ボタン |
タップ判定は世界座標から券のグリッドへ写像して行う。
ズームアウトしすぎてめくれない場合、警告を出すのではなく、タップ地点に向けて自動でズームインする(操作の空振りを発生させないため)。
初回起動時は中央付近の券にスケール1で寄ったまま開始し、指アイコンが点滅して目印になる。
約1秒間アクションがなければ、ゴーストが指を動かしながら3枚をめくって見せる。
自分でタップすれば指アイコンは消え、通常の操作に戻る。
4. 技術構成
- フロントエンドは単一の
index.html。フレームワークなし、Canvas 2D のみ。 - 描画はカメラ倍率に応じてLODを切り替え。可視矩形のカリングで、画面外の券は描画しない。
- 5等・末等の判定は座標ハッシュ。固定座標を
Mapで持つのは上位等賞のみ(合計5,000件強)。 - 状態は
Set(購入済み)とMap(当選)で保持。ブロックごとのめくり済み枚数も別途キャッシュし、広域描画時の暗さを決める。 - アイコンは元画像から
System.Drawingで複数サイズへ生成。小サイズは中央のクジラに寄せてクロップし、可読性を確保。 - ホスティングは Cloudflare Pages、デプロイは Wrangler CLI(
npm run deploy)。
ソース1ファイルでフレームワークなしなので、改造や移植もしやすい。
5. 期待値の話
1ユニットの理論上の還元率はおよそ43%。
100万円使えば、平均で約43万円戻り、57万円が損失となる。これが、宝くじを「資産形成手段」とは呼べない理由。
ただし、1等7億円という「分散の大きい外れ値」に賭ける娯楽として割り切るなら、300円で7億円の宝を1日預けて夢を見る、というコストパフォーマンスは悪くない、という見方もできる。
本アプリは前者(数字の現実)を、視覚的に押し付けがましくなく確認するための道具。
まとめ
- 高額宝くじの1ユニット=2,000万枚を画面上で再現し、めくる体験を提供する。
- 1等は1枚(1/2,000万)。5等・末等は座標ハッシュで判定し、軽量に動作する。
- 投資・払戻・損益、当選の内訳を常時表示し、確率の偏りを数字でも見せる。
- 単一HTML、Canvas 2Dのみ。Cloudflare Pagesでデプロイ。







