チンチロリン

カイジでチンチロリンをちょうどやってたので役の割合を調べてみた。
子(または親)に番が回ってきたときに出る役の割合。

use strict;
use warnings;

my $MENASHI = 0;
my $MEARI   = 1;
my $SHIGORO = 2;
my $ZOROME  = 3;
my $PINZORO = 5;
my $HIHUMI  = -2;

my $ALL_CNT = 100000;

my %hash;
foreach my $i (1..$ALL_CNT) {
	my ($yaku, $sai) = chinchiro();
	$hash{$yaku} = (exists $hash{$yaku}) ? $hash{$yaku} + 1 : 1;
}

foreach my $key (sort keys %hash) {
	printf "%2d is %5d %5.2f%%\n", 
		$key,
		$hash{$key},
		$hash{$key} * 100 / $ALL_CNT;
}

sub chinchiro
{
	my $yaku = $MENASHI;
	my @sai;

	# 役が出るまで3回チャンスがある
	foreach my $cnt (1..3) {
		@sai = ();
		# =====================
		# サイを振る
		# =====================

		# 一度に振るサイは3つ
		foreach my $num (1..3) {
			push @sai, int(rand(6)) + 1;
		}
		# 昇順
		@sai = sort { $a <=> $b } @sai;
		
		# =====================
		# 役判定
		# =====================
		# シゴロ
		if ($sai[0] == 4 && $sai[1] == 5 && $sai[2] == 6) {
			$yaku = $SHIGORO;
		}
		# ゾロ
		if ($sai[0] == $sai[1] && $sai[1] == $sai[2]) {
			$yaku = $ZOROME;
		}
		# ピンゾロ
		if ( ($sai[0] + $sai[1] + $sai[2]) == 3) {
			$yaku = $PINZORO;
		}
		# 目あり
		if ($sai[0] != $sai[2] && 
			($sai[0] == $sai[1] || $sai[1] == $sai[2])) {
			$yaku = $MEARI;
		}
		# ヒフミ
		if ($sai[0] == 1 && $sai[1] == 2 && $sai[2] == 3) {
			$yaku = $HIHUMI;
		}
		#print "sai=@sai $yaku\n";
		last if $yaku != $MENASHI;
	}
	return ($yaku, "@sai");
}

__END__

結果は以下のとおり。
C:\work>perl test.pl
-2 is  4760  4.76% ヒフミ
 0 is 12474 12.47% 目なし
 1 is 73061 73.06% 目あり
 2 is  4821  4.82% シゴロ
 3 is  4071  4.07% ゾロ目
 5 is   813  0.81% ピンゾロ