ナンバーズ4の必勝理論を検証する【10万円でできるかな】


ナンバーズ4の必勝理論?

2019年9月30日にテレビ朝日系列で「10万円でできるかな」という番組が放送されました。

番組内の企画でナンバーズ4という4つの数字を選ぶ形式の宝くじを実際に購入して高額当選を狙うというものがありました。
その中で当選確率を上げるための方法として3つの「理論」が紹介されていました。

しかし、「これって確率的に当たり前のことを言ってるだけじゃないの?」と疑問に思ったので実際に計算してみました。

以下ではナンバーズ4の4桁の当選番号は0000~9999の1万通りの中から完全に無作為に選ばれているものと仮定して計算します。

なお、詳細は記憶していなかったためこちらのサイトを参考にさせていただきました。

また、計算間違い・よりエレガントな計算方法などがあればコメント欄でご教授ください。

足す9理論

足して9になる2つの数字の組を含めるようにし、残りの2つは自由に選ぶようにすると当たりやすいというもの。
足して9になるのは、(0,9), (1,8), (2,7), (3,6), (4,5)の5組です。

番組内では過去100回の49%がこの理論通りだと紹介されていました。

この理論を満たす場合の数は以下の積になります。

  • 足して9になる組をどこに入れるか : ${}_4P_2 = 12$通り
  • 足して9になる組の数 : 5通り
  • 残り2つの数字を自由に選ぶ : $10 \times 10 = 100$通り

よって全パターンの内、足す9理論を満たすものの割合は、
$$
(12 \times 5 \times 100) \div 10000 \times 100 = 60\%
$$

となります。
つまり、
ランダムに選ばれた4つの数字の60%には足して9になる数字の組が含まれている
=当選番号の内の60%には足して9になる数字の組が含まれている
ということであり、当選番号の多くが足す9理論を満たすのは当然のことと言えます。

連続数字理論

(0,1)や(5,6)などのように連続する2つの数字の組が含まれるように選び、残り2つの数字は自由に選ぶようにすると当たりやすいというものです。
なお、連続する2つの数字は4桁の中のどの位置にあっても良いということだそうです。

つまり、例えば連続数字として(0,1)を選ぶとすると、(0,1,3,5), (0,3,1,5), (3,1,5,0)などは全て連続数時理論の要求を満たすということです。

番組内では過去100回の75%がこの理論通りだと紹介されていました。

この理論については場合分けが面倒だと感じたので簡単なプログラムを書いて総当たりで確認することとしました。
(エレガントな計算方法があれば教えて下さい。)

ソースコードは以下の通りです。

renzoku.py
import numpy as np

# numsの各行に1万通りの4つの数字の組を入れる
nums = np.zeros((10000, 4))
for i in range(10):
  for j in range(10):
    for k in range(10):
      for l in range(10):
        index = i*1000 + j*100 + k*10 + l
        nums[index, 0] = i
        nums[index, 1] = j
        nums[index, 2] = k
        nums[index, 3] = l

# 各桁の数字±1となる数字が他の桁に含まれるもののみ抽出する
include_successive_nums = []
for i in range(10000):
  if (nums[i][0]-1 in nums[i][[1,2,3]]) or \
  (nums[i][0]+1 in nums[i][[1,2,3]]) or \
  (nums[i][1]-1 in nums[i][[0,2,3]]) or \
  (nums[i][1]+1 in nums[i][[0,2,3]]) or \
  (nums[i][2]-1 in nums[i][[0,1,3]]) or \
  (nums[i][2]+1 in nums[i][[0,1,3]]) or \
  (nums[i][3]-1 in nums[i][[0,1,2]]) or \
  (nums[i][3]+1 in nums[i][[0,1,2]]):
    include_successive_nums.append(nums[i])

print("Probability = {}%".format(len(include_successive_nums)/10000*100))

得られた結果から確率を計算してみると、ランダムに選ばれた66.3%は連続数字理論を満たすことが分かりました。

引っ張り理論

前回の当選番号に含まれる数字から1つまたは2つを選ぶようにし、残りの3つまたは2つの数字は自由に選ぶようにすると当たりやすいというものです。
番組内では過去100回の82%がこの理論通りだと紹介されていました。

こちらの理論も場合分けが面倒に思えたので総当たりで計算しました。以下にソースコードを示しますが、Pythonで高速に計算する方法が思い付かなかったので、Matlabで計算しました。(下記ソースコード内のismember関数を使う部分をPythonで上手く行う方法が分かりませんでした。)

hippari.m
% numsの各行に1万通りの4つの数字の組を入れる
nums = zeros(10000,4);
for i = 1:10
    for j = 1:10
        for k = 1:10
            for l = 1:10
                index = (i-1)*1000 + (j-1)*100 + (k-1)*10 + l;
                nums(index,1) = i-1;
                nums(index,2) = j-1;
                nums(index,3) = k-1;
                nums(index,4) = l-1;
            end
        end
    end
end

% numsの各行の数字がいくつ含まれているか、総当たりで確認してresultsに格納
% ismember関数の引数のnumsが今回の当選番号、nums(i,:)が前回の当選番号の意味合い
results = zeros(10000,10000);
for i = 1:10000
    tmp = ismember(nums, nums(i,:));
    tmp = sum(tmp,2);
    results(:,i) = tmp;
end

% 全パターンの内、前回の数字を0~4個含むものの確率をそれぞれ計算する
for i = 1:5
    prob(i) = sum(sum(results==i-1)) / (10000 * 10000) * 100;
end

得られた結果は以下のようになりました。

前回の数字 確率1
0個 19.55%
1個 37.81%
2個 29.82%
3個 11.17%
4個 1.65%

過去100回の82%の的中率というのが何の数字を指すのか明確なところは不明ですが、少なくとも1個前回の数字を含むということであれば、この結果の1個以上の確率の総和が80.45%となっておりおおよそ近い値を示しています。

まとめ

番組で説明されていた各理論の過去100回の的中率と、当選番号が無作為抽出であるとして計算した確率を表にまとめました。

理論 番組で説明された過去100回の確率 当選番号が無作為抽出であるとして計算した確率
足す9理論 49% 60%
連続数字理論 75% 66.3%
引っ張り理論 82% 80.45%

多少の差異はあるものの、それなりに両者は近い数字と言えるのではないでしょうか?
つまり、各理論を満たす数字が当選番号に多いのは当然のことであり、単純にその理論を満たすパターン数が多いだけのことです。
また、両者が過去100回の確率と理論値が近いということはナンバーズ4の当選番号の選定が無作為に行われていることを示唆します。(今回はナンバーズ4の過去の当選番号のデータの調査は行っていないので本当のところは分かりませんが。)
そして無作為であればどの番号も当選確率は等しく0.01%ということになります。

ということで、何も気にせず好きな番号を買えばいいのではないか、というのが計算結果を確認しての私の感想です。


  1. 小数点以下第3位を四捨五入