[PHP]コインを何回投げれば連続10回表が出るのか
今回はタイトルのようにコインを何回投げれば連続10回表が出るのかPHPを使って検証していきます。
実際にコインを投げて試すというのもいいですがそんなに暇ではないのでプログラムの力を借ります。
プログラムをどうやって作るか
変数$resultにコインを投げた結果を一回ずつ代入する。
(例えば一回目に表、二回目に裏、三回目に表が出た場合、$result="表裏表"となる)
この$resultの中身に"表表表表表表表表表表"が含まれた瞬間に試行を終了するプログラムをwhile文を使って実装する。
(これくらいしか方法を思いつきませんでした(´・ω・`))
実装
今回のプログラムの全体はこんな感じです。
$coin = ['表', '裏'];
$count = 0;
$result = "";
while(!strpos($result, "表表表表表表表表表表")):
$rand_num = rand(0, 1);
$result = substr_replace($result, $coin[$rand_num], -1, 0);
$count++;
endwhile;
echo $result."\n";
echo $count."回の試行で表が10連続出ました";
/* 実行結果 */
表表裏裏表裏・・・・・・
・・・・・・裏表裏裏表表表表表表表表表表
468回の試行で表が10連続出ました
この時は468回で試行が終わりましたが、実行結果によっては5000回を越えたりします(笑)
これを実際に自分の手でやろうと思うとすごい時間がかかりますがプログラムに任せれば1秒で結果が出ます。
必要な変数を定義する
$coin = ['表', '裏'];
$count = 0;
$result = "";
$coinに表と裏のリストを作成します。表が出た場合$coin[0]として結果を$resultに代入していく感じです。(のちに説明します)
次に$countにコインを投げた回数をカウントします。もし45回コインを投げれば$count=45です。
$resultにはコインを投げた結果を一回ずつ代入します。表裏表表と出たら$result="表裏表表"です。
表が連続10回出るまでコインを投げる処理
while(!strpos($result, "表表表表表表表表表表")):
$rand_num = rand(0, 1);
$result = substr_replace($result, $coin[$rand_num], -1, 0);
$count++;
endwhile;
$resultの中に”表表表表表表表表表表”という文字列が含まれるまでコインを投げ続ける処理を書いていきます。
まず、文字列の中に特定の文字列が含まれるか判定する関数がstrpos()です。TrueかFalseを返します。使い方は以下です。
strpos(検索する文字列, 特定の文字列);
strpos($result, "表表表表表表表表表表")とすることで$resultに"表表表表表表表表表表"が入っている場合はTrueを返すということです。
それをwhileの条件式に利用します。ただしこれをそのまま条件式としてしまうと「”表表表表表表表表表表”が含まれている間」に処理をするという意味になります。条件は「"表表表表表表表表表表"が含まれない間」ですから先頭に!を付けることで真偽を逆にして対応できます。
rand(0,1)として0か1をランダムで取得し、$rand_numに代入し、$coin[$rand_num]で表か裏が決まります。
また、コインを一回投げるたびに$countが一ずつ増えていく処理も忘れずに。
そして、ここからが難しかったのですが$resultの中に表か裏のいずれか出た方を追加していきます。
一回目表 - $result="表"
ニ回目裏 - $result="表裏"
三回目裏 - $result="表裏裏"
四回目表 - $result="表裏裏表"
これを繰り返していくわけですがそのときに使える関数がsubstr_replace()です。使い方は以下です。
substr_replace(
入力する文字,
置換する文,
何番目から,
何個分,
);
substr_replace($result, $coin[$rand_num], -1, 0)とすることで「$result」に「末尾」から「ゼロ個分」を「$coin[$rand_num]」を置換する、という意味になります。つまり、末尾に$coin[$rand_num]を追加するということです。
echo $result."\n";
echo $count."回の試行で表が10連続出ました";
最後に、結果を出力してプログラムの完成です。
100回連続で表が出るには何回投げればいい?
プログラムは完成しましたが、ちょっと気になったことがあって「10回連続を100回連続にしたら何回目で終了するの?」と思いました。
てなわけでやってみると、、、うんともすんとも言わなくなりました。さすがに100回連続で表を出すのはプログラムでも無理そうでした(笑)
今回はコインゲーム(?)的なものを作ってみました。まだまだPHPでできることはたくさんあるのでこれからもたくさん投稿していきます!
以上です。