jug7.com
[ home / cgi / juggler / column / diary / bbs / link / welcome ]
source : 1000円でのコイン持ちの計算
#!/usr/bin/perl
# 1000円当たりのコイン持ちを計算
$cginame = 'coinmochi.cgi';
$title = '1000円でのコイン持ちの計算';
# データの読みこみ
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
read (STDIN, $input, $ENV{'CONTENT_LENGTH'});
}
foreach $str (split(/&/,$input)) {
($name,$value) = split(/=/, $str);
push(@input, $value);
}
($n_re_p, $n_recoin, $n_k1_p, $n_k1coin, $n_k2_p, $n_k2coin, $n_k3_p, $n_k3coin, $n_k4_p, $n_k4coin,
$n_k5_p, $n_k5coin, $gen, $kasan, $big_p, $bigcoin, $reg_p, $regcoin, $reset,$re_p, $recoin,
$h_k1_p, $l_k1_p, $k1coin, $h_k2_p, $l_k2_p, $k2coin, $h_k3_p, $l_k3_p, $k3coin,$h_k4_p, $l_k4_p, $k4coin,
$h_k5_p, $l_k5_p, $k5coin, $counter) = @input;
$n_re_p = 7.298 if !$n_re_p;
$n_recoin = 3 if !$n_recoin;
$kasan = 256 if !$kasan;
$re_p = 7.298 if !$re_p;
$recoin = 3 if !$recoin;
$bigcoin = 15 if !$bigcoin;
$regcoin = 15 if !$regcoin;
$reset = 1 if !$reset;
$counter = 1 if !$counter;
# HTML の radio ボタンにチェックを入れる
$counter_chk[$counter] = 'checked';
$reset_chk[$reset] = 'checked';
print "Content-Type: text/html\n\n";
# ヘッダとフォームの表示
print <<"__ HTML __";
<!DOCTYPE html PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>
<html lang='ja'>
<head>
<meta http-equiv='Content-Type' content="text/html; charset=shift_jis">
<title>jug7.com - cgi $title</title>
<style type="text/css"> <!--
A:hover {color:#ff0000;}
--></style>
</head>
<body text='#000000' bgcolor='#ffffff' link='#0000ff' alink='#ff0000' vlink='#0000cc'>
<font size=7><b><font face='Times New Roman,Times'>jug</font><font face='Bookman Old Style,arial black,Helvetica Black'>7</font><font face='Times New Roman,Times'>.com</font></b></font>
<hr color='#00aa00'>
<strong>[ <a href='../index.html'>home</a> / <a href='index.html'>cgi</a> / <a href='../jug/index.html'>juggler</a> / <a href='../column.html'>column</a> / <a href='../diary/index.html'>diary</a> / <a href='bbs.cgi'>bbs</a> / <a href='../link.html'>link</a> / <a href='../intro.html'>welcome</a> ]</strong>
<br><br><br>
<div align='center'><h2>$title</h2></div>
<hr width='70%'>
<div align='right'>[ <a href='coinmochi_memo.html'>memo</a> / <a href='coinmochi.html'>source</a> ]</div>
<center>
<form action='$cginame' method='POST'>
<br>
<blockquote>
小役カウンタ搭載機については試行錯誤中。現在はシミュ結果によるもの。<br>
カウンタ非搭載機については計算結果。
<br><br>
各小役確率は3枚掛けでの払い出し枚数です。(例:角に止まったチェリーは4枚など)<br>
リプレイを考慮しない場合は、リプレイの払出しを 0枚 に書き換える。
</center>
</blockquote>
<br>
<table border=1 align='center' cellspacing=0>
<tr align='center' bgcolor='#ffffcc'><td colspan=3><b>小役カウンタ非搭載機</b><font size=2>( 計算結果 )</font></td></tr>
<tr align='center'><td><font size=2>(3枚掛け時)</td><td><font size=2>確率</td><td><font size=2>払い出し</td></tr>
<tr align='center'><td><font size=2>リプレイ</font></td>
<td><font size=2> 1/</font><input type='text' size=7 name='n_re_p' value="$n_re_p"></td>
<td><font size=2> <input type='text' size=5 name='n_recoin' value="$n_recoin">枚</font></td></tr>
<tr align='center'>
<td><font size=2>小役1</font></td><td><font size=2> 1/<input type='text' size=7 name='n_k1_p' value=$n_k1_p></font></td>
<td><font size=2> <input type='text' size=5 name='n_k1coin' value="$n_k1coin">枚</font></td></tr>
<tr align='center'><td><font size=2>小役2</font></td><td><font size=2> 1/<input type='text' size=7 name='n_k2_p' value=$n_k2_p></font></td>
<td><font size=2> <input type='text' size=5 name='n_k2coin' value="$n_k2coin">枚</font></td></tr>
<tr align='center'><td><font size=2>小役3</font></td><td><font size=2> 1/<input type='text' size=7 name='n_k3_p' value=$n_k3_p></font></td>
<td><font size=2> <input type='text' size=5 name='n_k3coin' value="$n_k3coin">枚</font></td></tr>
<tr align='center'><td><font size=2>小役4</font></td><td><font size=2> 1/<input type='text' size=7 name='n_k4_p' value=$n_k4_p></font></td>
<td><font size=2> <input type='text' size=5 name='n_k4coin' value="$n_k4coin">枚</font></td></tr>
<tr align='center'><td><font size=2>小役5</font></td><td><font size=2> 1/<input type='text' size=7 name='n_k5_p' value=$n_k5_p></font></td>
<td><font size=2> <input type='text' size=5 name='n_k5coin' value="$n_k5coin">枚</font></td></tr>
</table>
<br><br>
<table border=1 align='center' cellspacing=0>
<tr align='center' bgcolor='#ffffcc'><td colspan=4><b>小役カウンタ搭載機</b> <font size=2>( シミュ結果 )</font></td></tr>
<tr align='center'><td> </td><td colspan=3><font size=2>減算値 <input type='text' size=5 name='gen' value="$gen">
加算値 <input type='text' size=5 name='kasan' value="$kasan"></font></td></tr>
<tr><td align='center'><font size=2 color='red'>BIG</font></td><td colspan=3><font size=2>
確率 1/<input type='text' size=13 name='big_p' value="$big_p">
払い出し <input type='text' size=3 name='bigcoin' value="$bigcoin">枚</font></td></tr>
<tr><td align='center'><font size=2 color='red'>REG</font></td><td colspan=3><font size=2>
確率 1/<input type='text' size=13 name='reg_p' value="$reg_p">
払い出し <input type='text' size=3 name='regcoin' value="$regcoin">枚</font></td></tr>
<tr><td colspan=4><font size=2> BIG による小役カウンタの<font color='blue'>リセット</font>
<input type='radio' name='reset' value=1 $reset_chk[1]> あり
<input type='radio' name='reset' value=2 $reset_chk[2]>なし</td></tr>
<tr align='center'><td><font size=2>(3枚掛け時)</td><td><font size=2>小役<font color='red'>高</font>確率<br>状態</td>
<td><font size=2>小役<font color='blue'>低</font>確率<br>状態</td><td><font size=2>払い出し</td></tr>
<tr align='center'><td><font size=2>リプレイ</font></td><td colspan=2 align='left'>
<font size=2><font color='#ffffff'>_</font> 1/<input type='text' size=7 name='re_p' value="$re_p"></td>
<td><font size=2> <input type='text' size=5 name='recoin' value="$recoin">枚</td></tr>
<tr align='center'><td><font size=2>小役1</font></td><td><font size=2> 1/<input type='text' size=7 name='h_k1_p' value="$h_k1_p"></font></td>
<td><font size=2> 1/<input type='text' size=7 name='l_k1_p' value="$l_k1_p"></font></td><td><font size=2>
<input type='text' size=5 name='k1coin' value="$k1coin">枚</font></td></tr>
<tr align='center'><td><font size=2>小役2</font></td><td><font size=2> 1/<input type='text' size=7 name='h_k2_p' value="$h_k2_p"></font></td>
<td><font size=2> 1/<input type='text' size=7 name='l_k1_p' value="$l_k2_p"></font></td><td><font size=2>
<input type='text' size=5 name='k2coin' value="$k2coin">枚</font></td></tr>
<tr align='center'><td><font size=2>小役3</font></td><td><font size=2> 1/<input type='text' size=7 name='h_k3_p' value="$h_k3_p"></font></td>
<td><font size=2> 1/<input type='text' size=7 name='l_k1_p' value="$l_k3_p"></font></td><td><font size=2>
<input type='text' size=5 name='k3coin' value="$k3coin">枚</font></td></tr>
<tr align='center'><td><font size=2>小役4</font></td><td><font size=2> 1/<input type='text' size=7 name='h_k4_p' value="$h_k4_p"></font></td>
<td><font size=2> 1/<input type='text' size=7 name='l_k1_p' value="$l_k4_p"></font></td><td><font size=2>
<input type='text' size=5 name='k4coin' value="$k4coin">枚</font></td></tr>
<tr align='center'><td><font size=2>小役5</font></td><td><font size=2> 1/<input type='text' size=7 name='h_k5_p' value="$h_k5_p"></font></td>
<td><font size=2> 1/<input type='text' size=7 name='l_k1_p' value="$l_k5_p"></font></td><td><font size=2>
<input type='text' size=5 name='k5coin' value="$k5coin">枚</font></td></tr>
</table>
<br><br><center>
小役カウンタ <b><input type='radio' name='counter' value=1 $counter_chk[1]>非搭載機
<input type='radio' name='counter' value=2 $counter_chk[2]>搭載機</b> の方を開始する。
<br><br>
<input type=submit value="開始"></center>
</form>
__ HTML __
# エラーチェック と GET での送信
if (grep { /[^\d]/ } ($gen, $kasan)) { $error = 1; $er_msg = '不適切な文字が記入されています。'; };
if (grep { /[^\d\.]/ } @input) { $error = 1; $er_msg = '不適切な文字が記入されています。'; };
@prob = ($n_re_p, $n_k1_p, $n_k2_p, $n_k3_p, $n_k4_p, $n_k5_p);
@coin = ($n_recoin, $n_k1coin, $n_k2coin, $n_k3coin, $n_k4coin, $n_k5coin);
for (0..5) {
$exp[$_] = $coin[$_] / $prob[$_] if $prob[$_];
$total_exp += $exp[$_];
}
if ($total_exp >= 3) { $error = 1; $er_msg = '不適切な数値入力です。'; }; # 小役だけで機械割 100% 超
if ($ENV{'REQUEST_METHOD'} ne 'POST') { $error = 1; $er_msg = 0; }
if ($er_msg) {
print q{<center><b><font color='red' size=4>*** ERROR !! ***</font><br><br>},"\n";
print "$er_msg</b></center>\n";
}
if ($error) {
print '<br><br><br><br><br>';
print q{<strong>[ <a href='../index.html'>home</a> / <a href='index.html'>cgi</a> / <a href='../jug/index.html'>juggler</a> / <a href='../column.html'>column</a> / <a href='../diary/index.html'>diary</a> / <a href='bbs.cgi'>bbs</a> / <a href='../link.html'>link</a> / <a href='../intro.html'>welcome</a> ]</strong>};
print q{<div align='right'>[ <a href='coinmochi_memo.html'>memo</a> / <a href='coinmochi.html'>source</a> ]</div>};
print '</body></html>';
exit;
}
#----------------------------------------------------------------------
# 計算開始
# $counter==1 が小役カウンタ非搭載、 $counter==2 が小役カウンタ搭載
#----------------------------------------------------------------------
$play = 0; # 1000円当たりのプレイ数
if ($counter == 1) { # 小役カウンタ非搭載
$play = 50 / (3 - $total_exp);
$play = &point($play, 3);
print '<center><br>***** 計算結果 *****<br><br>';
print "<b>1000円当たりのゲーム数 <font color='red' size=4>$play</font> P。</b></center>\n<br><br><br>";
} elsif ($counter == 2) { # 小役カウンタ搭載
# 乱数の数を計算 ( 総数は 65536 )
@data = ($big_p, $reg_p, $re_p, $h_k1_p, $l_k1_p, $h_k2_p, $l_k2_p,
$h_k3_p, $l_k3_p, $h_k4_p, $l_k4_p, $h_k5_p, $l_k5_p );
$list = @data;
for ($i=0; $i<$list; $i++) {
$r[$i] = ($data[$i]) ? int( 65536/$data[$i] + 0.5 ) : 0;
}
$rate = $gen / $kasan;
$bigr = $r[0];
$regr = $bigr + $r[1];
$repr = $regr + $r[2];
@k1r = ( $repr + $r[3], $repr + $r[4] ); # 小役高確率, 小役低確率 の順
@k2r = ( $k1r[0] + $r[5], $k1r[1] + $r[6] );
@k3r = ( $k2r[0] + $r[7], $k2r[1] + $r[8] );
@k4r = ( $k3r[0] + $r[9], $k3r[1] + $r[10] );
@k5r = ( $k4r[0] + $r[11],$k4r[1] + $r[12] );
# シミュレート開始
$i = $in = $out = $coin = $bigcount = $regcount = 0;
$trial= 50000; # シミュの試行回数
while ($i < $trial) { # シミュレートのループ開始
$i++; $in += 3; $coin -= 3;
$r = int( rand(65536) +1 );
$m = (($out/$in) <= $rate ) ? 0 : 1; # $m=0 が小役高確率状態
if ($r <= $bigr) { # BIG 当選
$bigcount++;
if ($reset==1) { $in = 0; $out = 0; }
else { $out += $bigcoin; $coin += $bigcoin; }
} elsif ($r <= $regr) { $regcount++; $out += $regcoin; $coin += $regcoin; } # REG 当選
elsif ($r <= $repr) { $coin += $recoin; $in -= $recoin; } # replay 当選
elsif ($r <= $k1r[$m]) { $coin += $k1coin; $out += $k1coin; } # 以下小役
elsif ($r <= $k2r[$m]) { $coin += $k2coin; $out += $k2coin; }
elsif ($r <= $k3r[$m]) { $coin += $k3coin; $out += $k3coin; }
elsif ($r <= $k4r[$m]) { $coin += $k4coin; $out += $k4coin; }
elsif ($r <= $k5r[$m]) { $coin += $k5coin; $out += $k5coin; }
}
$play = ($coin) ? abs( $trial * 50 / $coin ) : 0;
$play = &point($play, 3);
$big = ($bigcount) ? &point( ($trial/$bigcount), 3 ) : '∞';
$reg = ($regcount) ? &point( ($trial/$regcount), 3 ) : '∞';
print "<center><br>***** シミュレーション結果 *****<br><br>";
print "<b>1000円当たりのゲーム数 <font color=red size=4>$play</font> P。</b>";
print "<br><br> BIG 1/$big REG 1/$reg ( $trial P 試行 )";
print "</center>\n<br><br><br>";
}
# フッタ
print <<"__ HTML __";
<div align='right'>[ <a href='coinmochi_memo.html'>memo</a> / <a href='coinmochi.html'>source</a> ]</div>
<strong>[ <a href='../index.html'>home</a> / <a href='index.html'>cgi</a> / <a href='../jug/index.html'>juggler</a> / <a href='../column.html'>column</a> / <a href='../diary/index.html'>diary</a> / <a href='bbs.cgi'>bbs</a> / <a href='../link.html'>link</a> / <a href='../intro.html'>welcome</a> ]</strong>
</body></html>
__ HTML __
exit;
# 少数を四捨五入して指定の桁にする
sub point {
my($value, $fig, $x);
($value, $fig) = @_;
$value = int($value * (10 ** $fig) + 0.5) / (10 ** $fig);
if ($value =~ /(\d+)\.(\d+)/) { $x = $2; }
elsif ($value !~ /\./) { $x =''; $value .= '.'; }
$value = $value.'0' x ( $fig - length($x) );
return $value;
}
[ home / cgi / juggler / column / diary / bbs / link / welcome ]