ぴたすちお、一人麻雀練習機などの自作フリーソフトの配布、数独などのパズル、麻雀、その他もろもろ
あらのHP 数独まにあ エクセルまにあ 麻雀研究所 賢く儲ける株式投資 お釣り となりのぽぽろ なたでぽぽ FX

スポンサードリンク

新婚さんいらっしゃい!のペアマッチ その2

その1  その2  その3  その4  その5

確率計算

ということで、ペアマッチについて様々な確率を求めてみようと思い立った私ですが、実はちょっと甘く見ていました。確率の計算については人よりもちょっと得意だとか思っているので、10分とか20分とか、悪くても一時間もすれば答えを出せるんじゃないかなーとか思ったわけです。しかし、実際に考え出してみると意外と面倒な計算が必要だということが発覚したのです。

例えば、一人目が平均何枚取れるのかを計算するとします。

そうすると、まずは一発で当てないといけないので、最初の二枚で一枚取れる確率としては1/15です。で、その場合にはもう一回めくれるので、1/13の確率でもう一枚取れることになります。さらに1/11でもう一枚取れて…という計算になります。最後まで書くと、

1/15 + 1/13・15 + 1/11・13・15 + … + 1/3・5・7・9・11・13・15 + 1/1・3・5・7・9・11・13・15 = 0.0723

となります。つまり一人目の人は平均すると0.07枚取れるということです。

ここまではいいのですが、二人目が平均何枚取れるかを計算しようとすると急に面倒になります。何故かというと、一人目が一枚も取れなかった場合、一枚取った場合、…について、すべて計算して足し合わせる必要があるからです。この時点ですでに手計算 では無理っぽい感じになってきます。

そして、三人目の確率を求めようとするとさらにやっかいな問題が出てきます。

例えば、一人目も二人目も一枚も取れなかった場合で考えてみましょう。単純に考えると、まだ見えていないパネルは16-4=12なので、1/11で最初の一枚が取れるように思えます。しかし、そうでない場合もあるということに注意しなければいけません。例えば一人目がパネル1と2をめくったとしましょう。これが違う賞品で二人目に 順番が移ったとします。そして二人目がパネル3と4をめくりました。ここまでで四枚のパネルがめくられている状況です。この四枚がすべて違う賞品であれば上記の計算でいいのですが、例えばパネル1とパネル4が同じ 賞品だという可能性があるのです。そうすると三人目の人は当然これを取ることができるので、最初の一枚を取れる確率は100%として計算しないといけないのです。これはやっかいです。

さらに、先攻の夫婦の勝率なんかを計算しようとすると、もっと面倒なことになります。上記の計算でN人目の人が平均何枚取れるかを出すことは出来るのですが、それだけでは勝率は出てきません。つまり、一人目がw枚で、二人目がx枚、三人目がy枚、四人目がz枚、というそれぞれの 状況でさらに場合分けが必要になってくるのです。これについては、今回はシミュレーションを行いました。

 

確率計算のアルゴリズム

ということで、手計算で確率を出すのは無理そうなので、プログラムを書いてしまうことにしました。以下、その考え方について説明して行きます。

まずはパネルの状態の場合分けから行いました。以下の四通りに分けることができます。

このそれぞれの状態の賞品が何組あるかによって、パネルの状態を記述することが出来ます。例えば、開始時の状態は、すべてのカードがめくられていないので、上から、0、0、0、8ということになります。パネル1、2をめくってそれが違う賞品だった場合には、0、0、2、6です。

次に、各パネル状態から一人分の進行があったときの遷移確率を計算してやります。これが出来てしまえば、後は四回繰り返すだけで最終的な確率分布が求まるというわけです。この計算を行うときにポイントになるのは、賞品をとった場合にはその人がもう一回めくれるという 神経衰弱のルールです。確率計算を行うときにはこれが結構面倒なわけですが、幸いにも再帰関数という便利な手段がありますので、プログラム的にはエレガントに実装することが可能です。

以下に計算アルゴリズムの概略を示します。別に何言語ということはなく、適当に流れだけ書いています。

function Pairmatch( A, B, C, D )
 
% A : すでにとられている
% B : 両方とも見えている
% C : 片方だけ見えている
% D : 両方とも見えていない
 
% 両方見えているなら取る
if B > 0
    Pairmatch( A+B, 0, C, D ); (再帰)    確率 1
    return;
end

% 全部取った場合は終了

% まだ見えていない枚数
N = C + D * 2;

% 一枚目で、すでに見えているペアのもう一方を引いた場合
P1 = C / N;
Pairmatch( A+1, B, C-1, D );    (再帰)    確率 P1

% 全部取った場合は終了

% 二枚目の処理
 
% 片方が見えているペアを開けてしまう確率
P2 = (1-P1) * C / (N-1);
[A B+1 C D-1]                             確率 P2

% 両方とも見えていないペアを開ける確率
P3 = (1-P1) * (D*2-2) / (N-1);
[A B C+2 D-2]                             確率 P3

% 偶然とれる確率
P4 = (1-P1) * 1 / (N-1);
Pairmatch( A+1, B, C, D-1 );    (再帰)    確率 P4

ポイントは、賞品を取った場合には再帰的に自分を呼び出してやることです。こうすることで、ややこしい事は考えずに、上記のように直感的な形で書くことが出来ます。

スポンサードリンク
その1  その2  その3  その4  その5

このページに対するご意見ご感想は (ara999 あっと gmail.com ) までお願いします

あらのHP 数独まにあ エクセルまにあ 麻雀研究所 賢く儲ける株式投資 お釣り となりのぽぽろ なたでぽぽ FX