シェアする

  • このエントリーをはてなブックマークに追加

[PHP]ランダムな4桁の数字(0パディングあり)を生成する最適解は?

銀行の暗証番号のような0パディングありの4桁の数字を生成するとき、

$code = substr(mt_rand(10000, 19999), 1, 4);

こんな風に書いてみたけどどうだろう?

でも桁数が増えると重くなりそうだから、単純にmt_rand(0,9)の値を文字列に追加したほうがいいのかな?

$digits = 4;
$code = '';
for ($i = 0; $i < $digits; $i++) {
	$code .= mt_rand(0, 9);
}

ちなみに前者の方法だとmt_randの引数のminがPHP_INT_MAXを超えるとfalseが返ってきちゃうから使えない。あと、一定数を超えると偶数に偏るそうだ。
桁数が少ない時はワンライナーで書ける前者、多い時は後者を関数にして使おうか。

	/**
	 * @param int $digits 桁数
	 * @throws Exception
	 * @return string
	 */
	function getCode($digits = 4) {
		$min = pow(10, $digits);
		if ($min > PHP_INT_MAX) {
			throw new Exception('Exceeded the PHP_INT_MAX');
		}
		$max = $min * 2 - 1;
		return substr(mt_rand($min, $max), 1, $digits);
	}
	
	/**
	 * @param int $digits 桁数
	 * @return string
	 */
	function getCode($digits = 4) {
		$code = '';
		for ($i = 0; $i < $digits; $i++) {
			$code .= mt_rand(0, 9);
		}
		return $code;
	}

関数にすると長くて制約のある前者の処理は無いな。

もっといい方法があれば教えて下さい。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする