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 ]