Tech
Webシステムプログラマーによる、ちょっとためになる(かもしれない)情報共有ブログ
 

【第31回】PHPでランダム数字を生成する

 
今日はランダム数字の生成です。

任意の数字を作りたい場面はよくあります。

会員番号の生成、おみくじなどなど、いろいろ使われています。

ランダムな数字の作り方はいろいろあります。


まずはとても簡単なものから・・・

rand()関数を使います。

<?

$random1 = rand();

$random2 = rand(1,5);

$random3 = mt_rand();

$random4 = mt_rand(0,99);

$random5 = mt_rand( 2147483647, 9999999999 )

?>

実行すると・・・

random1 = 740002563
random2 = 1
random3 = 1458199756
random4 = 49
random5 = 1630082324

rank関数、またはmt_rank関数に引数を入れると、数字の範囲を設定できます。
random2は1から5、random4は0から99となります。

引数がない場合は、getranmax()関数、またはmt_getRandmax()関数で出てきた値
が最大値となります。

<?

$randmax = getrandmax();

$mtrandmax = mt_getrandmax();

echo("randmax = $randmax");
echo("<br>");
echo("mtrandmax = $mtrandmax);

?>

randmax =   2147483647
mtrandmax = 2147483647

この場合は、最大値が2147483647となります。10桁を超えるとそれ以上は表示で
きません。

random5がその例で、2147483647よりも大きい数を指定していますが、出てくる
数はそれよりも小さな数字が出ています。

次に0から20の範囲で20回ループして、ランダムに数字を取得します。
次のプログラムを実行します。

<?

for ( $i = 0; $i < 20; $i++ ){
    
    $num = rand(0,20);
   
    echo("num". $i . "=". $num . "<br>");
   
}

?>

実行すると・・・

num0=11
num1=5
num2=3
num3=16
num4=16
num5=18
num6=3
num7=10
num8=15
num9=19
num10=10
num11=9
num12=7
num13=2
num14=0
num15=3
num16=9
num17=1
num18=17
num19=17

取り出すことはできましたが、同じ数がいくつか見られます。

簡単なもので重複してもいい場合は、これだけで十分です。

しかし、1つずつ取得して、重複しないように数字を取得したい場合もあります。

この場合は、配列を作り、配列の中身をごちゃまぜして、ひとつひとつ取り出し
ます。

次のプログラムを実行してみます。

<?
$num_list = range(1, 20);

$num_list = shuffle($num_list);

foreach( $num_list as $key => $values ) {

    echo("key: $key ". "num: $values ". "<br>");

}

?>

range関数で1から20までの数字の配列を作り・・・。
shuffle関数で要素の順番を適当に並び替えます。

結果はごらんの通り。重複しない数字を取り出すことができます。

key: 0 num: 11
key: 1 num: 5
key: 2 num: 7
key: 3 num: 15
key: 4 num: 6
key: 5 num: 2
key: 6 num: 8
key: 7 num: 19
key: 8 num: 14
key: 9 num: 1
key: 10 num: 13
key: 11 num: 3
key: 12 num: 16
key: 13 num: 4
key: 14 num: 17
key: 15 num: 9
key: 16 num: 18
key: 17 num: 10
key: 18 num: 12
key: 19 num: 20

shuffle()関数は全部の配列を対象に並び替えますが、
1~20の数字のうち重複しないで2つとか半分だけ取り出したい場合もあるかも
しれません。

この場合はarray_rand()関数を使います。

次のプログラムを実行してみます。1から20までの数字の配列から任意の10個を
重複なしで取り出します。

$num_list = array_rand($num_list, 20);

<?
$num_list = range(1, 20);

$num_list = array_rand($num_list, 10);

foreach( $num_list as $key => $values ) {

    echo("key: $key ". "num: $values ". "<br>");

}

?>

実行すると・・・

key: 0 num: 11
key: 1 num: 2
key: 2 num: 3
key: 3 num: 5
key: 4 num: 7
key: 5 num: 4
key: 6 num: 19
key: 7 num: 8
key: 8 num: 0
key: 9 num: 1

重複しないで1から20のうち10個取得できています。

今週は数字をいろいろな方法で適当に取り出してみましたが、やっぱり文字列も
一緒にしたいですね。

そして、数字も14桁とか20桁とかもっと大きな数字も取り出したいと考えるかも
しれません。

ということで、来週は10桁を超える数字と文字列を含めたランダム文字列の生成
について書きたいと思います。

おしま~い。

トラックバック(0)

トラックバックURL: http://blog.promob.jp/mt/mt-tb.cgi/159

コメントする