それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

数分おきに一度変わる乱数がほしい

乱数は実行する度に違う結果を返しますが、固定することができます。
1時間に一度変わるような表示を考えた時に1時間キャッシュしておくのも有りなんですが。簡単なものであればプログラム側ランダムで済ませてしまい、全体をプロキシキャッシュしたほうが楽ちんですね。

乱数の結果を一定期間固定する

シードを固定します。

シードを10分間固定すれば同じ値が変えてっ来ます。

<?php
ini_set('date.timezone',"Asia/Tokyo");
$date_str = date('Y-m-d H:00:00');# 一時間毎にシードがに変わる。
$time = strtotime($date_str);
mt_srand($time);
echo mt_rand(0,10). "\n" ;
}

シードにユーザーIDを含めれば、ユーザ毎に10分間同じ乱数結果を与える事が可能になったり。シードを固定するテクニックは使えそう。

本当に変わってるか比較してみる

mt_rand と rand はシードを共有しない別関数なので比較のために両方を実行し実験してみる。

ini_set('date.timezone',"Asia/Tokyo");
$date_str = date('Y-m-d H:i:00');# 1分間毎に変わる。

echo $date_str;
$time = strtotime($date_str);
mt_srand($time);
foreach(range(0,9) as $i){
	echo mt_rand(0,10) . ":mt_rand\n";
	echo rand(0,10) . ":rand\n";
}

それぞれ、10回実行してみたら、rand は実行する度に値が変わりますが、mt_randは毎回同じ結果でした。めでたしめでたし。



関連資料

むかし10分間に一度ランダムに表示が切り替わるような広告を出したいってときにやりました。
10分に一回ランダムで表示が変わるような乱数を作る。 - それマグで!

参考資料

PHP: srand - Manual