質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

409閲覧

if文の連続とfor文、while文の使い方 rand関数でシュミレーションを行いたい

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/10/12 08:14

編集2018/10/12 08:47

いつもお世話になっております。
rand()関数を使ったシュミレーションを行いたいと考えております。

①勝負の回数は1セット100回を50セット
②勝てば10coinがもらえ、負ければ10coin失う
③負けが連続で3回続いたら、またはcoinが100coinを超えたらその時点で1セット終了
④1セット100回の勝負を50セット繰り返した結果の勝ち回数・負け回数を表示したい

内容は以上となります。

php

1<?php 2 3$coin = 0;//それぞれの初期値を設定 4$renzokumake = 0; 5$katigame = 0; 6$makegame = 0; 7$i = 0; 8 9for($i = 0; $i <= 49; $i++;){//50セット 10 11for($i = 0; $i <= 69; $i++){//70回勝負 12$drop = rand(1, 2);//勝ちは1、負けは2 13while($renzokumake > 3){//連続負けが3回超えたら終了 14while($coin >= 100){//coinが100を超えたら終了 15 16if($drop == 1){//勝ちの時は10coin増え、負けの時は10coin減る 17 $coin = $coin + 10; 18}else{ 19 $coin = $coin - 10; 20} 21 22if($drop == 1){//勝ちの時は0のまま、負けの時は1増える 23 $renzokumake = 0; 24}else{ 25 $renzokumake = $renzokumake++; 26} 27 28if($coin > 100){//coinが100を超えたときにはそのセットを強制終了、$katigameのカウントが1増える 29 $katigame++; 30}elseif($renzokumake == 3){//負けが連続3回続いた時もそのセットを終了、$makegameのカウントが1増える 31 $renzokumake++; 32}else{ 33 34} 35 36echo $katigame; 37echo "<br />";//50セット繰り返した後の最終的な$katigameの数と$makegameの数を表示したい 38echo $makegame; 39} 40} 41 42} 43} 44?>
実行結果

という感じになっております。

26
24
のように出力できればと考えております。

なお、$coinのランダム表示、$renzokumakeのランダム表示は成功しており、
for文の連続の書き方、また$katigame・$makegameの書き方が悪いのではないかという推論までは
立てている次第です。

毎度進歩もなく初歩的な質問でありましたら大変恐縮ですが、
もしお時間ありましたらご教示いただければ幸いです。

php

1修正① 2<?php 3 4$zandaka = 0;//初期値をそれぞれ設定 5$renzokumake = 0; 6$katigame = 100; 7$makegame = 0; 8 9 10for($i = 0; $i <= 49; $i++){ 11 12for($i = 0; $i <= 69; $i++){ 13$drop = rand(1, 2);//バンカー1、プレイヤー2 14 15while($renzokumake < 3){//連続負けが3回超えたら終了 16while($zandaka <= 100){//残高が100を超えたら終了 17 18if($drop == 1){ 19 $zandaka = $zandaka - 15; 20}else{ 21 $zandaka = $zandaka + 15; 22} 23 24if($drop == 1){ 25 $renzokumake = $renzokumake++; 26}else{ 27 $renzokumake = 0; 28} 29 30if($zandaka > 100){ 31 $katigame++; 32}elseif($renzokumake == 3){ 33 $renzokumake++; 34}else{ 35 36} 37 38 39 40} 41} 42echo $katigame; 43echo "<br />"; 44echo $makegame; 45} 46} 47?>
Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp\htdocs\casino02.php on line 17

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2018/10/12 08:23

コインがマイナスになってもよいのでしょうか?またはcoinが100枚を超えたらというのは買ったら100コインもらえるということですので2回連続で勝てば終了なのでしょうか?
dice142

2018/10/12 08:23

質問は何でしょうか?どこに詰まっているかがわからないのですが。
退会済みユーザー

退会済みユーザー

2018/10/12 08:26

yambejp様 コインはマイナスになっても良しとしております。また1回の勝負で動くコインは10coinです。質問内容を修正致しました、失礼致しました。
退会済みユーザー

退会済みユーザー

2018/10/12 08:27

dice142様 現状、表示ができておりません。正解のためのアドバイス・ご指摘を希望しております。
dice142

2018/10/12 08:29

「以上が内容です」という欄に質問があるとわかりにくいので、「現状出力がされないこと」を別途質問文に明記した方が良いかと思います。
torisan

2018/10/12 08:32

いろいろ仕様が不足しています。 もう一度質問内容の見直しをお願いします。
退会済みユーザー

退会済みユーザー

2018/10/12 08:35

dice142様 編集しなおしてみました、ご指摘ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/10/12 08:36

torisan様 ご指摘ありがとうございます。「仕様の不足」というのは何かを具体的にお教えいただければ幸いです。
guest

回答3

0

ベストアンサー

言われるがまま・・・

PHP

1$res=[0,0]; 2for($j=1;$j<=50;$j++){ 3 $mycoin=0; 4 $win=[1,1,1]; 5 for($i=1;$i<=100;$i++){ 6 $x=mt_rand(0,1); 7 $res[$x]++; 8 $mycoin+=$x?10:-10; 9 array_shift($win); 10 array_push($win,$x); 11 print $j."-".$i.":".($x?"W":"L").":".json_encode($win).":".json_encode($res)."/coin:".$mycoin."<br>"; 12 if($mycoin>100 or array_sum($win)===0){ 13 break; 14 } 15 } 16 print "<hr>".json_encode($res)."<hr>"; 17}

$res[0]が負け数、$res[1]が勝ち数

負けると2倍、勝つと元にもどる

$ratioを設定すればよいでしょう

PHP

1$res=[0,0]; 2for($j=1;$j<=50;$j++){ 3 $mycoin=0; 4 $win=[1,1,1]; 5 for($i=1;$i<=100;$i++){ 6 $x=mt_rand(0,1); 7 $res[$x]++; 8 if($win[2]==0 and $win[1]==0){ 9 $ratio=4; 10 }elseif($win[2]==0){ 11 $ratio=2; 12 }else{ 13 $ratio=1; 14 } 15 $mycoin+=($x?10:-10)*$ratio; 16 array_shift($win); 17 array_push($win,$x); 18 print $j."-".$i.":".($x?"W":"L").":".json_encode($win).":".json_encode($res)."/coin:".$mycoin."<br>"; 19 if($mycoin>100 or array_sum($win)===0){ 20 break; 21 } 22 } 23 print "<hr>".json_encode($res)."<hr>"; 24} 25

投稿2018/10/12 09:16

編集2018/10/17 03:22
yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/12 09:40

yambejp様 いつもいつもご助力いただき誠にありがとうございます。 想定以上のものでした。 関数に対する勉強不足(もちろんそれだけではないですが)を特に痛感いたしました。 yambejp様からのご回答をまず理解できるよう精進したいと思います。 ありがとうございました!
yambejp

2018/10/12 09:48

何度かためせばわかりますが、ほぼ各対戦は50回位内に片が付くので 100回まで到達することはないと思いますよ
退会済みユーザー

退会済みユーザー

2018/10/15 02:25

おはようございます。 ご連絡が遅くなってしまい申し訳ございません。 試してみると、大体50回以内に片付きますね。 これからいただいたコードをよく噛み砕かせていただきます! ありがとうございました!
退会済みユーザー

退会済みユーザー

2018/10/17 02:50

yambejp様 おはようございます。 1つ質問させていただきたいのですが、いただいたコードに条件(マーチンゲール法・・1度負けたら倍BET)を付けたいのですが, <?php $res=[0,0];           for($j=1;$j<=50;$j++){     $mycoin=0; $win=[1,1,1]; for($i=1;$i<=100;$i++){ $x=mt_rand(0,1); $res[$x]++; $mycoin+=$x?10:-10; if($mycoin+=$x?-10){                 $mycoin = $mycoin+=$x?20:-20; }elseif($mycoin == -30){ $mycoin+=$x?40:-40; }elseif($mycoin == -70){ $mycoin+=$x?80:-80; }else{} array_shift($win); array_push($win,$x); print $j."-".$i.":".($x?"W":"L").":".json_encode($win).":".json_encode($res)."/coin:".$mycoin."<br>"; if($mycoin>100 or array_sum($win)===0){ break; } } print "<hr>".json_encode($res)."<hr>"; とすると 「Parse error: syntax error, unexpected 'for' (T_FOR) in ...」という エラーが出ます。 for文でこの条件を付けることは不可能でしょうか。 もし可能でしたら「ここが違う」「こうしたら」といったアドバイスいただけましたら幸いです。 お時間あるときにでもぜひお知恵をお貸しくださいませ。 宜しくお願い致します。
yambejp

2018/10/17 03:00

> 1度負けたら倍BET 1度負けた次は20、2度負けたら40で大丈夫ですか?
退会済みユーザー

退会済みユーザー

2018/10/17 03:07

はい、仰る通りです。
yambejp

2018/10/17 03:22

負けたら2倍、勝ったら戻るの仕様を追記しました
退会済みユーザー

退会済みユーザー

2018/10/17 03:28

ありがとうございます! 大変勉強になりました。 (と言いますかこれからif文の中をphp逆引きレシピ見ながら自分なりに読み解いていきます) お手数をお掛け致しました。 毎度、本当に感謝です。ありがとうございました!
退会済みユーザー

退会済みユーザー

2018/10/30 08:31

yambejp様 お世話になっております。 解決済みの質問で何度もコメント申し訳ございません。 条件の変更に関してまたご質問させていただきたいのですが、 新しい質問としてあげたほうがよろしいでしょうか? こちらのサイトは特定の方(yambejp様)のみが閲覧・回答できるといった 事は...難しいですよね、共有するためのサイトですし。。
guest

0

色々エスパー&勝手に変更。
恐らくやりたいのはこういうことかと。
変更点:コインの最小は0(マイナス許容したいならif($coin != 0)の部分を削除すればよし)

PHP

1$katigame = 0; 2$makegame = 0; 3 4for($i = 0; $i < 50; $i++){//50セット 5 $coin = 0; 6 $renzokumake = 0; 7 for($j = 0; $j < 100; $j++){//100回 8 9 $drop = rand(1, 2);//バンカー1、プレイヤー2 10 11 if($drop == 1){//勝ちの時は10coin増え、負けの時は10coin減る 12 $coin += 10; 13 if($coin > 100){//coinが100を超えたときにはそのセットを強制終了、$katigameのカウントが1増える 14 $katigame += 1; 15 break; 16 }else{ 17 continue; 18 } 19 }else{ 20 if($coin != 0){ 21 $coin -= 10; 22 } 23 $renzokumake += 1; 24 if($renzokumake == 3){//負けが連続3回続いた時もそのセットを終了、$makegameのカウントが1増える 25 $makegame += 1; 26 break; 27 }else{ 28 continue; 29 } 30 } 31 } 32} 33echo "勝利".$katigame.":".$makegame."敗北";

100回マックスまでいっても決着がつかなかった場合は未考慮。

投稿2018/10/12 08:41

madoka9393

総合スコア992

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/12 08:57

madoka9393様 ご回答いただきありがとうございます。 また稚拙な質問内容汲み取っていただき感謝です。 まさにこのような感じです。 "$coin=0" に1000入れてみたら希望通りに動いてくれました! 完コピ失礼します。
退会済みユーザー

退会済みユーザー

2018/10/12 09:00

1つだけ質問させてください。 「100回マックスまでいっても決着がつかなかった場合は未考慮」とありますが $coin=1000にして更新かけるとちゃんと50セット分の勝敗が出てくるのですが 上記コードでは$katigame・$makegameの条件は無視して単純に勝利:敗北をランダム表示しているということでしょうか?
madoka9393

2018/10/12 09:03

初期値1000だと100回中一度でも勝利するとそのセットは勝ちになってしまうのでは…。 追加・修正依頼で色んな方が仰る通り、いまいち正解が見えないので質問者さんがそれでいいならいいのだろうか…。
madoka9393

2018/10/12 09:09 編集

初期値を変更しなくても高確率で50セット分の勝敗が出ますよ。 (よっぽど100回までに決着が付かない=勝利or敗北条件を満たさない場合がない) ただし基本負けが多い(確率的に負けになりやすい)ので「0:50」だとか極端な結果になりやすいだけです。
退会済みユーザー

退会済みユーザー

2018/10/12 09:20

そうですね、100coin超えたら$katigameに+1だと1回勝利でセット終了ですね。 ご指摘ありがとうございます。 初期値0で試したら表示してくれました。(1:49とかですけど)
退会済みユーザー

退会済みユーザー

2018/10/12 09:23

お察しかもしれませんが、このシュミレーションのモデルはバカラなんです。 10coinずつ賭けていって、100coin行けば利確、負けが3回続けば損切で次回へという条件で50セットやった時にどんな結果になるのかというのを作りたかったのです。 わかりづらくて申し訳ござませんでした。
guest

0

とりあえず「表示がされないこと」が主題のようなので、仕様は見ずにその点だけ回答します。

whileの条件が逆です。
終了条件を条件式としていますが、whileの条件式は継続条件です。

また、echoがwhileの中に入っていますが、
最後にだけ出力したいならechoの場所も変える必要があります。

投稿2018/10/12 08:35

編集2018/10/12 08:37
dice142

総合スコア5158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/12 09:01 編集

dice142様 ご回答ありがとうございます。 while文の解釈ができておりませんでした。 またwhile文の外にechoを置いてみました。 ご教示ありがとうございます。もしお時間ありましたら正答へのアドバイスも頂けましたら幸いです。
dice142

2018/10/12 08:49

正答とは何に対する正答でしょう? 表示されないという質問へはおそらく間違えていないような気がするのですが。
退会済みユーザー

退会済みユーザー

2018/10/12 09:02

そうですね、質問がおかしかったです。 失礼いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問