開発日誌

PHPでmt_randを使用して乱数を作ってみる

PHPで乱数を生成するときに、mt_rand()関数で乱数を作る場面があると思いますが、

連続で同じ数字が出てきて何か嫌だ!

でも綺麗に乱数が生成されてるから、まっいっか!

って事はないでしょうか?

筆者はたまに思ったりします!

しかし、乱数生成時に同じ数字の重複は避けたい!っていう場面が出てくると思います。

そこで、かんたんに同じ数字が重複しない乱数の生成方法を紹介したいと思います。


まず単純に0から9の数字で10桁の乱数を作るスクリプトです。

for($i = 0; $i < 10; ++$i){
	$num = mt_rand(0,9);
	$ransu .= $num;	
}

結果:9838260512

 

8と2が重複してしまいました。


下記の様にすると、同じ数字が重複しない乱数の生成ができます。


$suji = '0123456789';
for ($i = 0; $i < 10; ++$i) {
	$len = mb_strlen($suji);
	$j = mt_rand(0,$len-1);
	$num = $suji[$j];
	$ransu .= $num;
	//1度で出た数字は対象外にする
	$suji = str_replace($num,"",$suji);
}

結果:5673108942

 

 1つも同じ重複する数字がでてこないですね(b^-゜)


ポイントは1度出た数字は次のループでは使わない。
という所です。

この考えを元に上手く利用すれば、精度の高いランダム処理が実現できると思います。


例えば複数のバナー画像をランダム表示させる仕組みで、
偏りなく全ての画像を平均的になるように表示したい場合、


1度表示した画像は、他の画像が表示されるまで表示させない!

という方法をとれば実現できると思います。


ちなみに、同じ数字を使用しない乱数を生成したい場合は、 「shuffle」関数でも実現が可能です。
$array = range(0,9);
shuffle($array);

結果:4093752186

こちらの方がお手軽ですね。

この記事がみなさんの制作するプログラミングのヒントにでもなれば幸いです。



(hirohito)

Webシステムのツボとは

オープンソースの紹介や、プログラミング講座、フリーソフトのレビューなど、Webエンジニアが送る、つれづれ日記。
【隔週金曜日更新】

運営会社:株式会社ジーピーオンライン

RSSを購読する

Monthly Archive