(Python)当選してない番号を集合の差で求める

場合の数・確率
準備するもの
  • Linux PC(本記事の確認環境はDebian 8.3 Jessie)
  • 端末ウィンドウ(ターミナルソフト)
  • coreutilsパッケージ
  • Python(本記事の確認環境はv2.7.9)

年末年始、何かとお金が入用です。 本気で宝くじを当てにいかねばなりません。

といっても、億円レベルは要らないので(いただけるのなら貰いますが)、ローリターンで確率の高い宝くじにします。やはりナンバーズ3、ミニでしょう。00から99の間の数字の中から選ぶので、当たる確率は100分の1。

過去の当たり番号(みずほ銀行)の当選発表から、

日付(タブ)番号

という形式で約400回分をまとめたminiというファイルを使って、数字がどう現れているのか確認したいと思います。

takk@deb83:~/blog/src$ wc -l mini
400 mini
takk@deb83:~$ head mini
12/01	39
11/30	28
11/29	17
11/28	90
11/25	09
11/24	39
11/23	50
11/22	25
11/21	22
11/18	81
takk@deb83:~$ 

400回中一番多く出現した数字は?

takk@deb83:~$ cut -f2 mini | sort | uniq -c | sort -r | head -1
      9 87
takk@deb83:~$ 

87という番号が9回当たっています。

00〜99すべての数字が出現していたのでしょうか。wcで確認します。

takk@deb83:~/blog/src$ cut -f2 mini | sort | uniq | wc -l
97
takk@deb83:~/blog/src$ 

あれ、3個足りません。

はて。この3つは何番なんでしょうか。

sortしてdiffを使えば以下のようにすぐ抽出できますが、今回は「集合の差」で求めたいと思います。

takk@deb83:~$ seq -f "%02g" 0 99 > all
takk@deb83:~$ cut -f2 mini | sort | uniq | sort | diff - all
35a36
> 35
37a39
> 38
74a77
> 76
takk@deb83:~$ 

まずpythonのリストを使って全番号を並べてみます。
ソースはこれです。

takk@deb83:~$ cat -n read-mini.py
     1	f=open("mini")
     2	lis=f.readlines()
     3	lis=[int(x.split('\t')[1]) for x in lis]
     4	print lis

これを実行すると、当選番号のリストが表示されます。

takk@deb83:~$ python read-mini.py
[39, 28, 17, 90, 9, 39, 50, 25, 22, 81, 

(省略)

 37, 41, 65, 78, 84, 9, 66, 62, 77]
takk@deb83:~$

当選番号リストができたら、次は00-99のリストも作って、00-99リストと、当選番号の集合(set)の差を求めます。
ソースです。

takk@deb83:~$ cat -n read-mini.py
     1	f=open("mini")
     2	lis=f.readlines()
     3	lis=[int(x.split('\t')[1]) for x in lis]
     4	all=[x for x in range(100)]
     5	print set(all) - set(lis)

実行してみましょう。

takk@deb83:~$ python read-mini.py
set([35, 76, 38])
takk@deb83:~$ 

35,76,38が、過去400回のうち一度も当選していない番号です。

確率なので、00-99の番号は同じ確率で出現するはず。。。。
しかし400回も出現していないなんて、35,76,38という番号は、今後果たして当たりやすいのか外れやすいのか。

コメント

タイトルとURLをコピーしました