0〜9の数字をランダムに5個並べて、ポーカーもどきの遊びをやってみる。すると、論理的
には、10^5=100000(通り)中、
役無し
:30240
ワンペア :50400
ツーペア :10800
スリーカード : 7200
フルハウス : 900
フォーカード : 450
ファイブカード : 10 (通り)
となるはずである。そこで、円周率πの小数点以下100003位までの数字を準備して、
1:[3,1,4,1,5] -> ワンペア
2:[1,4,1,5,9] -> ワンペア
3:[4,1,5,9,2] -> 役無し
4:[1,5,9,2,6] -> 役無し
5:[5,9,2,6,5] -> ワンペア
・・・・・・・・・・・・・・・・・・
100000:[4,6,4,1,2] -> ワンペア
と、100,000回のゲームをしたと見なして、その結果の統計を調べみたら、
役無し :30081
ワンペア :50636
ツーペア :10679
スリーカード : 7234
フルハウス : 921
フォーカード : 437
ファイブカード : 12 (通り)
となった。正に、円周率の数字の出方は、ランダムと呼ぶにふさわしさでゲームを構成して
くれる。技術的とプログラムの未熟さで、100,000回しか調査できなかった。
(統計を調べるのに目でのカウントも使った部分がある。)
何方か、10^6、10^7回分の統計結果を出して貰えませんか?
らすかるさんからのコメントです。(令和元年5月29日付け)
以下のようになりました。10^5の値が、GAIさんと異なっている理由はわかりません。
10^5 10^6 10^7 10^8 10^9
役無し :30081 302163 3020640 30238237 302410894
ワンペア :50636 503737 5040419 50400521 503973692
ツーペア :10741 108504 1081997 10799107 108001091
スリーカード : 7172 72014 721568 7201482 72016252
フルハウス : 918 8944 89785 899602 9001107
フォーカード : 440 4534 44597 451070 4497124
ファイブカード : 12 104 994 9981 99840 (通り)
GAI さんからのコメントです。(令和元年5月29日付け)
目で確認していた部分をもう一度点検し直してみたら、いつの間にかスリーカードにチェッ
ク印を付けるべき所を、ツーペアの物に印を62個分つけていました。
ですから、スリーカードは、7234-62=7172(通り)で、ツーペアは、17913-7172=10741(通り)
となり、やっとらすかるさんの結果と一致できました。
重複する数字を潰して3種類の数字となるパターンを集めて(ツーペアとスリーカードの分
類をプログラム的に処理できなかったので・・・)、対称物が17913(個)だったので全部数字
で表し、これらをツーペアとスリーカードに目で分類しておりました。間違わないようにと慎重
に目作業をしていた積もりですが、ちょっとした油断で間違っちゃうんですね。
フルハウスとフォーカードも重複する数を潰して、2種類になるものが1358個あったので、
全部数字に直し目で点検したつもりでした。
フルハウスとして分類しておった中に3個のフォーカードが紛れていました。
(目が疲れている!)
これで同じ値がとれました。
プログラム力を付けて、極力機械にミスなく処理してもらえるように精進しなくては・・・。
私は10万個の円周率のデータを格納するだけでも一苦労したのに、らすかるさんは、10^9
までの範囲で、難なく処理されているのに驚愕です。
らすかるさんからのコメントです。(令和元年5月29日付け)
私は、以下のように処理しました。
値が、例えば、13353 とします。まず、0〜9の数字別にカウントします。
0:0個、1:1個、2:0個、3:3個、4:0個、5:1個、6:0個、7:0個、8:0個、9:0個
これは、10要素の配列をクリアしてから、5桁それぞれについて、桁の値を配列の添え字
に当てはめて、「+1」するだけなので簡単ですね。
(つまり13353なのでa[1]、a[3]、a[3]、a[5]、a[3]を順に1増やす)
次に、同じ処理をもう一度行います。つまり、上の配列を、個数別にカウントします。
「0個」:7個、「1個」:2個、「2個」:0個、「3個」:1個、「4個」:0個、「5個」:0個
これも、6要素の配列をクリアしてから、先程の配列の10要素それぞれについて、配列の
値を6要素の配列の添え字に当てはめて、「+1」するという全く同じ処理です。
(上の配列の中身が0個、1個、0個、3個、0個、1個、0個、…なので、
b[0]、b[1]、b[0]、b[3]、b[0]、b[1]、b[0]、…を順に1増やす)
ここまで出来ればもう終わったも同然ですね。
「5個」が0個でなければ、ファイブカード
「4個」が0個でなければ、フォーカード
「3個」が0個でないとき、「2個」が0個でなければ、フルハウス、0個ならば、スリーカード
「2個」が2個なら、ツーペア、1個なら、ワンペア、0個なら、役無し
ちなみに、適当に探して見つけたサイトから15億桁のデータをダウンロードして処理しまし
たが、さすがにこんなに大きいものはプログラムには組み込めませんので、ファイルを読み
込みながら処理しています。
GAI さんからのコメントです。(令和元年5月30日付け)
やっと自動化できました。6桁の整数で分類可能になるのですね。
役無し :550000
ワンペア :631000
ツーペア :712000
スリーカード :720100
フルハウス :801100
フォーカード :810010
ファイブカード :900001
Mathematicaを以前使っていた時は、tallyという頻度を求めるコマンドがあり便利だなとは
思っていましたが、1年間の使用期限で更新するにも高額で早々におさらばしておりました。
工夫すれば自分でコマンドを自由に作れるんですね。
moonlight さんからのコメントです。(令和元年6月1日付け)
最近 Wolfram Engine というのがフリーで公開されました。ずっと高価で使えなかった
Mathematica が無料でお気楽に使えるようになります。
(完全に使えるのかは、そもそもMathmematicaを使い込んだこともなく、随分以前によく見て
いた時からすれば、相当用途も技術も広がっているので、定かではありませんが)
tallyって、どういうコマンドなのか気になります。
S(H)さんからのコメントです。(令和元年6月1日付け)
Tally[{p, n, e, u, m, o, n, o, u, l, t, r, a, m, i, c, r, o, s, c,
o, p, i, c, s, i, l, i,
c, o, v, o, l, c, a, n, o, c, o, n, i, o, s, i, s}]
= {{p, 2}, {n, 4}, {e, 1}, {u, 2}, {m, 2}, {o, 9}, {l, 3}, {t, 1},
{r, 2}, {a, 2}, {i, 6}, {c, 6}, {s, 4}, {v, 1}}