2人でババ抜きをしてディール直後にカードが手元に残らない確率
ムスメと2人でババ抜きをしていて、あまりにもディール直後でいきなりババだけ残して終了となることが多いことに気づいた。使っていたのはJ、Q、K、Aの4種のカードとババ1枚と少なめだけど、それにしてももう少し奇数枚で割れても良さそうに思えた。
で、以下のプログラムを書いて調べてみた。
VAR = 4 deck = (1..VAR).to_a * 4 def delete_pair(h) hand = h.dup (1..VAR).each do |i| num = hand.find_all{|x| x == i}.size if num.even? then hand = hand.reject{|x| x == i} elsif num == 3 then hand.delete_at(hand.index(i)) hand.delete_at(hand.index(i)) end end hand end deck.combination(VAR*2).each do |hand| left_cards = delete_pair(hand) # print "#{hand} -> #{left_cards} : #{left_cards.size} \n" puts left_cards.size end
VARはカードの種類で、これを2、3、4、5と増やしていくと、手元に残るカードがゼロとなる確率は54.3%、27.2%、13.5%、6.6%となった。ということから類推すると、13種類のときには0.02%程度ではないかと思う。しかし実際にはVARが6以上だと組み合わせが爆発して処理が終わらない。
よく考えると、ある数のカードについてディール後の状態を考えると、4枚のカードが0:4、1:3、2:2、3:1、4:0という5つのケースにしかならない。で、大雑把に言うと、これらの確率は1/16、4/16、6/16、4/16、1/16となる。
奇数になってしまったら、そこで条件に当てはまらなくなるので、カードが1種類増えるごとに、4/16+4/16=1/2の確率となっていく。
ただ、これは2人のカードの枚数に偏りがあっても良いという条件の場合で、配ったあとに0:4となってはまずい。ので、問題はもう少し複雑だけど、まあだいたいそんなところなのじゃないかと予想。