配列から値をランダムに取得したい
ランダムな英数字を作成したい
PHPでは、ランダムな値を生成する関数がいくつか用意されています。この記事ではランダムな数値を生成する基本から、さまざまな値でランダム値を生成する方法をわかりやすく解説していきます。
※この記事ではPHPの「Version 7.1.1」で動作確認しました
ランダムな値を生成する(rand)
rand関数とは
rand関数はランダムな値を生成するときに使用します。ランダムな値とは規則性がない値のことで、乱数とも呼びます。
rand関数は生成するたびに異なる数値をランダムに取得するできます。たとえば「32856」の次は「53253」といった予測のつかない値を生成できます。
rand関数は以下のように記述します。
// 引数なし int rand ( void )
// 引数あり int rand ( int $min , int $max )
オプションの引数を省略した場合は、rand関数は乱数の最大値を取得するgetrandmax()の間の擬似乱数を取得します。
最小値、最大値を指定した場合、例えば最小値3で最大値10を指定したい場合はrand(3, 10)を指定します。
rand関数の使い方
ここではrand関数を使用して、乱数を取得する方法を見ていきましょう。「php_rand.php」ファイルを作成して、以下のプログラムを記述します。
'; echo '乱数2回目:'.rand().'
'; echo '乱数3回目:'.rand(); ?>
php_rand.phpをブラウザで実行すると、以下のようにランダムな数値が取得できていることがわかりますね。
乱数1回目:1249983705 乱数2回目:212397180 乱数3回目:1219088574
次に最小値と最大値を引数に指定した範囲指定の乱数の生成方法を見ていきましょう。php_rand.phpを以下のように変更します。
'; echo '乱数2回目:'.rand($min, $max).'
'; echo '乱数3回目:'.rand($min, $max); ?>
プログラムを実行すると、指定した最小値3、最大値10の間で乱数が生成されていることがわかります。
乱数1回目:5 乱数2回目:8 乱数3回目:3
ランダムな値を生成する(mt_rand)
mt_rand関数とは
mt_rand関数はrand関数と同じく数値などの値からランダムな値を取得するときに使用します。mt_rand関数はrand関数の代替手段と呼べる関数です。
- randとmt_randの違いは?
mt_rand関数はメルセンヌ・ツイスタと呼ばれる擬似乱数列生成器を使用しているため、rand関数より4倍以上高速に乱数を生成できると言われています。また、 rand関数で使用する古いライブラリの乱数発生器は、特性が不明であったり処理が低速のため、通常使用する分にはmt_rand関数を使用することをオススメします。/ 参考「PHP: mt_rand」
mt_rand関数の使い方
以下にmt_rand関数を使用して、乱数を取得する方法を紹介します。
<?php // 引数なし echo mt_rand().'<br>'; echo mt_rand().'<br>'; echo mt_rand().'<br>'; ?>
実行結果:
1591549315 1044238503 70809825
以下ではmt_rand関数の引数に最小値と最大値を指定しています。
<?php $min = 3; $max = 10; //乱数を生成する echo mt_rand($min, $max).'<br>'; echo mt_rand($min, $max).'<br>'; echo mt_rand($min, $max).'<br>'; ?>
実行結果:
8 10 7
ランダムな文字列を生成する
mt_rand関数を使用してランダムな文字列を生成する場合、ASCIIコードで指定された引数から文字を返すchr関数を併用して文字列を生成します。
ASCIIコードによる文字変換は65がA、90がZのため、ランダムな文字列を生成する場合はrand関数で最小値65、最大値95で指定する必要があります。
<?php //ランダムな文字列を生成する $rand_str = chr(mt_rand(65,90)) . chr(mt_rand(65,90)) . chr(mt_rand(65,90)) . chr(mt_rand(65,90)) . chr(mt_rand(65,90)) . chr(mt_rand(65,90)); echo $rand_str; ?>
実行結果:
LINCCR
実行結果のとおり、6文字のランダムな文字列を生成することができました。
配列の要素をランダムに取得する
配列から1つ以上の配列の要素をランダムに取り出したいときには、array_rand関数を使用します。
array_rand( $配列 [, int $要素数 ] )
第一引数にはランダムに要素を取得する配列を指定し、第二引数には取得する要素数を指定できます。array_rand関数は指定した配列のランダムなキー配列を返します。
<?php $fruits = ['apple'=>'100円', 'orange'=>'80円', 'melon'=>'300円', 'banana'=>'120円', 'pineapple'=>'350円']; //ランダムな要素を取得する $rand_key = array_rand($fruits, 3); print_r($rand_key); ?>
実行結果:
Array ( [0] => orange [1] => banana [2] => pineapple )
サンプルでは5つの要素がある連想配列をarray_rand関数を指定して、3つのランダムな要素のキー配列を取得しています。
第二引数は配列の要素数より大きな値を指定すると、以下のようなエラーが発生しますので注意しましょう。
PHP Warning: array_rand(): Second argument has to be between 1 and the number of elements
ランダムな英数字を生成する
ここではさまざまな方法で数値と文字列を組み合わせたランダムな英数字を生成する方法を紹介します。
str_shuffle関数を使用する
str_shuffle関数を使用すると、引数に指定した文字列をシャッフルすることができます。
以下の例では文字列として数値とアルファベットのa-z、A-Zが含まれた文字列をstr_shuffle関数の引数に指定しています。
実行結果:
ujY8xpQftU
このプログラムを実行すると、実行結果のようにランダムな英数字の文字列が作成されます。また、substr関数を使用することで文字列の範囲を指定することもできます。
uniqid関数を使用する
uniqid関数を使用することでもランダムな文字列を生成することができます。
uniqid関数はユニークなIDを生成するときに使用し、第二引数にTRUEを指定することで、返り値の最後に線形合同法(擬似乱数列の生成式の一つ)で生成された文字列が追加されます。
また、第一引数にrand関数を指定すると、さらにランダムな文字列を生成することができます。
実行結果:
35393474759ef0d7395d694.56621330
md5関数を使用する
md5関数は32文字の16進数からなるハッシュを取得することができます。
ハッシュとは簡単に例えるとデータを細切れするという意味があります。第一引数には対象の文字列を指定し、第二引数にTRUEを指定することで 16バイト長のバイナリ形式で取得することができます。
以下の例ではmd5関数の引数に前述したuniqid関数と、その引数にrand関数を指定して、より複雑な文字列を生成しています。
実行結果:
983408b6c0433eede226884de4420bc6
まとめ
ここではランダムな値を生成する方法について、
- rand関数を使用してランダムな値を生成する方法
- mt_rand関数を使用してランダムな値を生成する方法
- array_rand関数を使用して配列の値をランダムに取得する方法
- 配列からランダムな要素を取得する方法
- str_shuffle関数を使用してランダムな英数字を生成する方法
- uniqid関数を使用してランダムな英数字を生成する方法
- md5関数を使用してランダムな英数字を生成する方法
などについて解説しました。
乱数を使用した処理は、数値を選んで当てたり、抽選で数値を選んだり、ゲームなどの処理でもよく使用します。もし、乱数を生成する方法を忘れてしまったら、この記事を思い出してくださいね。