赤の他人の疑問を自分で解答してしまう「勝手に解答」シリーズ。
Teratailの質問リストで解決をしていない質問で、1週間以上解答が0件のモノを閲覧するのが最近なんだか楽しくなってきてしまいました。
初心者の分からないは無下に扱われガチですが、実はそれをちゃんと説明できる上位プログラマーの人も少ないという風にも思えて、教育に対して興味がある自分としては、
質問に対して、ちゃんと答えを出したいと考えてしまいます。
また、今回も、ワイ好みの質問を見つけたので、このブログで答えを見つけ出してみたいと思います。
質問内容
参考ページ :
https://teratail.com/questions/45le4hk0m8trh1
タイトル
PHP 乱数を配列に格納
質問内容
乱数を配列に格納しています
乱数を出しながら、最低でも3個、5という数字が配列に格納される仕組みを考えてるのですが、
うまい方法が考え付きません
(5が3個以下の場合最低3個は追加する)
どのように考えますでしょうか?
付属コード
<pre>
<?php
$array=[];
for($i=0;$i<10;$i++){
array_push($array,rand(0,10));
}
var_dump($array);
?>
<pre>
<?php
$array=[];
$count=0;
for($i=0;$i<10;$i++){
$r=rand(0,10);
array_push($array,$r);
if($r==5){
$count++;
}
}
if($count<3){
//3個以下だったら 素人的思考
for($i=0;$i<3;$i++){
$array= array_pop($array);
array_push($array,"5");
}
}
var_dump($array);
?>
※インデントなど、ブラウザで表示した時に見やすくなるようにコードを若干修正してあります。
ワイの解答
この質問では、次のように要件を定義していると考えられます。
・10個の乱数を取得して配列に格納する。
・配列内に5という数値が最低3個入っている必要がある。
単純にこれをサンプルプログラムで書いているフローは次のとおりです。
1. 配列の初期定義
2. 10回のループ処理
3. 乱数を取得して配列に追加
4. 乱数が5であれば、$countをインクリメント
5. 10回のループが終了
6. $countが3個よりも少なければ、次の処理を実施(3個以上なら、10に進む)
7. 3回のループ処理
8. 配列に5を追加
9. 3回のループが終了
10. 配列の中身を表示(var_dump)
これ実はもっと簡単にできちゃうんですよ。
まずは解答フローをお伝えすると、
1. 配列の初期定義(初期に5を3つ入れ込む)
2. 7回のループ処理
3. 乱数を取得して配列に追加
4. ループ終了
5. 配列の中身を表示(var_dump)
phpソースで書いてみると次の通りです。
<pre>
<?php
$array = [5,5,5];
for($i=0,$c=count($array); $i<10 - $c; $i++){
array_push($array , rand(0,10));
}
var_dump($array);
解説
5という数値が3個必ず入るのであれば、最初に5を3個配列に入れておけばいいじゃないですか。
そして、残りの配列(7個分)に乱数を入れれば良いんですよ。
プログラミングってこういう処理を簡単にするという、いわゆる「論理思考」が求められるんですよね。
初心者の人はこういう思考法が分からないというのもよくわかります。
答えを聞くと、まるでなぞなぞの答えが分かったような、スッキリ感がありませんか?
コレ、難しいプログラムで、自分で答えを見つけた時なんて、もっとすごい感覚を味わうことができるんですよね。
脳科学では、エンドロフィンが分泌されるようですね。
という事で、ソースもできるだけ短くなるように、かつ効率的になるように意識して作ってみました。
参考にしてもらえると幸いです。
あとがき
この質問、実は、掲示板部分で、荒れに荒れていた質問で、質問者の人が毒づいた整理付を吐いて、すでに退会している、捨て質問だったわけです。
でも、そんなゴミと化した質問を拾うのも、自分の役割と勝手に義務感を感じてしまうのもこのシリーズの面白い所。
誰に見られるか分かりませんが、この質問の解答欄にこのブログページのURLを貼り付けておきたいと思います。
誰かに届きますように!
0 件のコメント:
コメントを投稿