こんにちは。@mashiです。
重複しないランダムな数値が欲しいなーと思いましたので作りました。
ちなみに、重複してよいのであればこれですよね。
// 連続している数値候補の中から重複する可能性がある値を取得する
for ($i = 0; $i < 3; $i++) {
$num = random(0, 1);
echo $num;
}
重複しない数値が欲しい際というとif文かなと最初は思ったのですが、改修の際にあちこち触ることになりそう、また、見づらそうと思ってしまいモヤっとしたので、違う観点で作りました。というか、そもそもこういう関数って存在しないのかな。
// 連続している数値候補の中から重複しない値を取得する
function randomNotDuplicate ($from_num, $to_num, $count) {
$number_array = range($from_num, $to_num);
$random_array = array();
shuffle($number_array);
$random_array = array_slice($number_array, 0, $count);
return $random_array;
}
念のため簡単に解説です。
1.from_numからto_numまでの連続する数値を最初に配列に入れます
2.上記配列の中身の順番をシャッフルします
3.for文にてcountの個数だけシャッフル後の配列番号0から取得しrandom_arrayに格納します
条件分岐を使わないため後から見た際に分かりやすいし、個数や上限下限の変更も効くので問題なさそうかなと思っています。
このコードを利用・拡張することで、なんかできそうだなーと考えています。
というより、実は今回この実装を行った理由は、【4つの大項目それぞれについて、各大項目内で1つだけランダム小項目を選択しgood/badをランダムに選択しエクセルに出力する。なお、badの個数は0~1にする】という機能が必要だったからです。
予想以上に長くなり、本来のタイトルから若干それた気がするので別の記事( https://qiita.com/mashi/items/6f655d8202600966e85e )として投稿させていただきます。
ご興味があればぜひご覧ください。
なにかあればコメントをいただければ幸いです。
2020/11/13
@tadsan 様のご指摘でarray_slice()を利用するよう修正