記事の詳細
PHPでランダムに近い数値を出力する三つの方法(乱数生成方法)をご紹介します!
PHPでランダムに近い数値を出力する三つの方法をご紹介します!
いざ実装するときに少し迷うランダムな数値の出し方に関して。
出力の仕方はいろいろとありますが、自身が過去に使用したことのある三種類の出力方法をご紹介致します!
※本記事では1~100の範囲でランダムに近い数値を出す方法をご紹介致します。
mt_rand関数を使用する
もっとも簡単な方法は、mt_rand関数を使用してランダムな数値を出力する方法となります。
実際の使い方としては、下記のようなコードになります。
1 2 3 4 5 |
<?php // ランダム関数で取得 $valRandFunc = mt_rand(1, 100); echo 'mt_rand関数で取得した値は「'. $valRandFunc. '」でした'; ?> |
上記のコードを実行すると、1~100の間でランダムな数値を出力して表示します。
これが、ランダムに近い数値を取得する一つ目の方法となります。
microtime関数を使用する
次に簡単な方法としては、microtime関数を使用して数値を出力する方法となります。
microtime関数はランダムな数値を出力する関数ではなく、現在時刻を秒数で出力する関数になります。
microtime関数はマイクロ秒までの時間を出力するため、マイクロ秒の末尾二桁の数値を「ランダムな数値」として活用します。
厳密な意味での「ランダムな数値」とは異なりますが、マイクロ秒の数値を狙って取得することは難しいため、簡単なランダム値が欲しい場合に使用することがあります。
実際の使い方としては、下記のようなコードになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php $valMsec = 0; // マイクロ秒まで取得 $valMtimeFunc = microtime(true); // 小数点以下で文字列を分割 $arrayMtimeFunc = explode('.', (string)$valMtimeFunc); if($arrayMtimeFunc[1] != null){ // 小数点以下の下二桁取得 $strMsec = mb_substr($arrayMtimeFunc[1], -2); // 1~100の範囲に値を調整 $valMsec = (int)$strMsec + 1; echo 'microtime関数で処理をした値は「'. $valMsec. '」でした'; } ?> |
上記のコードを実行すると、1~100の間で数値を出力して表示します。
これが、ランダムに近い数値を取得する二つ目の方法となります。
mb5関数を使用する
三つ目の方法としては、mb5関数を使用して数値を出力する方法となります。
mb5関数はmd5ハッシュ値を出力する関数となります。
md5ハッシュ値は16進数の数値となりますので、16進数の数値の下二桁を切り取って、10進数に直した数値のさらに下二桁を切り取って「ランダムな数値」として活用します。
mb5関数はmd5ハッシュ値に変換するために文字列を入力する必要がありますので、今回はmicrotime関数で取得した値を入れてみましょう。
実際の使い方としては、下記のようなコードになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php // マイクロ秒まで取得 $valMtimeFunc = microtime(true); // microtime関数で取得した値をハッシュ値に変換 $strHashVal = md5((string)$valMtimeFunc); // 下二桁のみ取得 $strHashCutVal = mb_substr($strHashVal, -2); // 16進数を10進数に変換 $valDec = hexdec($strHashCutVal); if($valDec > 9){ $strDec = mb_substr((string)$valDec, -2); } else { $strDec = mb_substr((string)$valDec, -1); } // 1~100の範囲に値を調整 $valDec = (int)$strDec + 1; echo 'md5関数で10進数に変換して処理した値は「'. $valDec. '」でした'; ?> |
上記のコードを実行すると、1~100の間で数値を出力して表示します。
これが、ランダムに近い数値を取得する三つ目の方法となります。
ランダムに近い値を生成する方法はいろいろとあります
いかがでしたか?
今回ご紹介した三つの方法は、簡単な出力方法ではありますがそこそこ良い値が取れると思います。
完全にランダムな値を作成する事は難しいですが、mb関数を使用した方法のように、いくつかの関数を使用して値を作ることで、よりランダムに近い値を作成することは可能だと思います。
おそらくセキュリティ専門の方が見たら「こんなの法則性があってランダムな値とは違う!」というお叱りを受けそうな内容なので言及しておきますが…。
セキュリティ対策として使う場合の「ランダム値」はもっと厳密なものとなりますので、本記事のような方法で取得した値を使用するのは控えたほうが良いかもしれません…。
ではまた!
コメント
この記事へのトラックバックはありません。
この記事へのコメントはありません。