«前の日記(2015年11月02日) 最新 次の日記(2015年11月10日)» 編集

ema log


2015年11月07日 [長年日記]

_ [game]ごいたの初期手牌シミュレーション

1000万回シミュレーションさせてみました。し、王に関する数値はゲームで登場する確率ですが、香に関する数値は自分がそれを積もる確率です。(18:45、追記:香を二重にカウントしてしまっていたので修正しました)

(11/16追記)自分が積もる確率に統一した、シミュと理論値を出しました

(11/13追記)自分が積もる確率に統一した、5し5し以外のシミュと理論値を出しました

(11/12追記)5し5しが高すぎるとの指摘が入って、感覚的にも、理論的にもバグってそうなのですがバグが見つけられません。

役名出現回数パーセンテージ (有効数字三桁)
五し147620314.8 %
六し1844351.84 %
七し102550.103 %
八し1440.00144 %
五し五し9900.0099 %
三香3745413.75 %
四香194280.194 %
王だまだま225865122.6 %

ソースは以下の通りです

class SHI  ; def to_s; "し"; end; def to_i; 0x11; end; end
class GON  ; def to_s; "香"; end; def to_i; 0x21; end; end
class GIN  ; def to_s; "金"; end; def to_i; 0x31; end; end
class KIN  ; def to_s; "銀"; end; def to_i; 0x32; end; end
class BAKKO; def to_s; "馬"; end; def to_i; 0x33; end; end
class KAKU ; def to_s; "角"; end; def to_i; 0x41; end; end
class HI   ; def to_s; "飛"; end; def to_i; 0x42; end; end
class OU   ; def to_s; "王"; end; def to_i; 0x51; end; end

TIMES = 10000000

def main
	yama = Array.new(10, SHI.new)
	yama.concat Array.new( 4, GON.new)
	yama.concat Array.new( 4, GIN.new)
	yama.concat Array.new( 4, KIN.new)
	yama.concat Array.new( 4, BAKKO.new)
	yama.concat Array.new( 2, KAKU.new)
	yama.concat Array.new( 2, HI.new)
	yama.concat Array.new( 2, OU.new)

	goshi = rokushi = nanashi = hasshi = goshigoshi = sanngon = yonngon = 0

	damadama = 0

	TIMES.times do
#	100.times do
		yama.shuffle!
		hand1 = yama[ 0,8]#.sort_by{|o|o.to_i}
		hand2 = yama[ 8,8]#.sort_by{|o|o.to_i}
		hand3 = yama[16,8]#.sort_by{|o|o.to_i}
		hand4 = yama[24,8]#.sort_by{|o|o.to_i}

=begin
		puts hand1.map{|o|o.to_s}.join
		puts hand2.map{|o|o.to_s}.join
		puts hand3.map{|o|o.to_s}.join
		puts hand4.map{|o|o.to_s}.join
=end

		# ダマダマは発生する確率が欲しいので全部で調べる
		ou_counts = [
			hand1.count{|o|o.class == OU},
			hand2.count{|o|o.class == OU}, 
			hand3.count{|o|o.class == OU},
			hand4.count{|o|o.class == OU}
		]
		ou_counts.each do |ou_count|
			damadama += 1 if ou_count == 2
		end

		# しは5し5しが有るのでペアで調べないといけない 
		shi_counts = [
			[
				hand1.count{|o|o.class == SHI},
				hand2.count{|o|o.class == SHI}
			],
			[
				hand3.count{|o|o.class == SHI},
				hand4.count{|o|o.class == SHI}
			]
		]

		shi_counts.each do |shi_count1, shi_count2|
			case shi_count1
			when 5
				if shi_count2 == 5
					goshigoshi += 1
				else
					goshi += 1
				end
			when 6 then rokushi += 1
			when 7 then nanashi += 1
			when 8 then hasshi  += 1
			end
	
			case shi_count2
			when 5
				goshi += 1 if shi_count1 != 5 # 5し5しのときはカウントしない
			when 6 then rokushi += 1
			when 7 then nanashi += 1
			when 8 then hasshi  += 1
			end
		end

		# 香は自分の手札に来る確率を求めたいので、自分の手札だけみる
		gon_count  = hand1.count{|o|o.class == GON}
		case gon_count
		when 3 then sanngon += 1
		when 4 then yonngon += 1
		end
	end

	puts "だまだま:#{damadama}…#{damadama*100.0/TIMES} %"
	puts "五し:#{goshi  }…#{goshi  *100.0/TIMES} %"
	puts "六し:#{rokushi}…#{rokushi*100.0/TIMES} %"
	puts "七し:#{nanashi}…#{nanashi*100.0/TIMES} %"
	puts "八し:#{hasshi }…#{hasshi *100.0/TIMES} %"
	puts "五し五し:#{goshigoshi}…#{goshigoshi*100.0/TIMES} %"
	puts "三香:#{sanngon}…#{sanngon*100.0/TIMES} %"
	puts "四香:#{yonngon}…#{yonngon*100.0/TIMES} %"
end

main