- 2009-03-20 (金)
- カテゴリ:PHPメモ

1.まずはphpで乱数を取得する際に必要な関数をおさらいしてみます
1-1.rand() - php4 , php5
int rand(void) int rand(int $min , int $max)
rand()関数をコールする際にオプションの $min と $max を省略すると 0 〜 getrandmax()の間でランダムな整数を返す。
getrandmax()はwinだと3万くらい〜linuxとかだと20億くらい(プラットフォームによりけり?)。
そんなにでかい数字ではないと思うので,必要なら$maxを指定してください。
1-2.srand() - php4 , php5
([int $seed])
先に言っておきます!
srand() 及び mt_srand() はPHP4.2.0以降の環境では自動処理されるので必要ありません使いません。
オプション seed で乱数ジェネレータを初期化する。
seedを省略したらランダムな値が入る。
前述のrand関数を使う前に乱数発生器を初期化するための関数です。
使う場合にはオプションのseedにはnicrotimeなどでseedを作って入れてやります。
- //srandを使って乱数発生器を初期化してからrandで0から5の範囲内の乱数を得る
- srand((double) microtime() * 1000000);
- $random_number = rand(0, 5);、
1-3.mt_rand() - php4 , php5
mt_rand(void) mt_rand(int $min , int $max)
Mersenne Twisterという乱数発生器を使って乱数を得る。
Mersenne Twister: A random number generator (since 1997/10)
ちなみにrand関数ではlibcの乱数発生器が使われています。
Linux C Library (libc) について
オプション値 $min 及び $max を省略すると,0から mt_getrandmax() の範囲から乱数を取得します。
mt_getrandmax()で得られる数値はgetrandmax()でのそれと同じです。
phpマニュアルによるとmt_randは,randに比べて乱数の生成速度が4倍!速いらしい。
しかしながら同じページのコメント欄にはrandの方が常に3%程速いという書き込みもありました。
現時点ではこれ以上追求しませんので,詳しく知りたい方は調べてみてください,もしくは教えてください。
1-4.mt_srand() - php4 , php5
mt_srand([int $seed])
mt_randで使用する乱数発生器を初期化します。
srandと同じで,PHP4.2.0以降の場合は自動で同処理がなされますので必要ありません。
2.では重複しない乱数をある範囲内で必要なだけ取得するには?
- $rand_ar = range($min , $max);
- //range()を使い$min から $max までの整数を値に持つ配列を$rand_arに取得
- shuffle($rand_ar);
- //shuffle()を使い$rand_arの並びをランダムにする
- // $rand_ar[0]から$rand_ar[$num]には重複しない整数がランダムな順番で入っているので
- // 先頭から順番に好きなだけ取得することでランダムな整数を必要なだけ取得できる
ってことで発生させるのはこの2行で終わりです。
rand()は絶対使うと思ったのでおさらいしましたが・・・使いませんでした!
実は私も他の多くの方々のようにrand() もしくは mt_rand() を使って
「既に取得した整数かチェックしながら乱数を必要数集め続ける(既に取得していたら,発生させなおす)」
という明らかに無駄な処理が含まれている関数を作ってしまっていたのでした。
上記方法で納得できずに調べなおしたところこの方法を見つけたので今回差し替えてご紹介しました。
ちなみに,shuffleを使う方法もphp4.2.0未満の場合はsrandで乱数発生器を初期化しましょう。
その場合は
- $rand_ar = range($min , $max);
- srand((double)microtime()*1000000);// srandで初期化してあげましょう
- shuffle($rand_ar);
であとは同じくarray $rand_ar から取得できます。
3.その他・・・
その他色々なランダムな何かを作る方法が英語ですがこちらのコメント欄で白熱していて参考になります。
PHP: rand - Manual
16桁で5万個なら?
phpで ・重複しない ・ランダムな16桁の数字 を作りたいです。 5万個ぐらい作りたいです。 md5だと英字も入ってしまうし・・・ 良い方法を教えてください。 .. - 人力検索はてな
多言語 (flashlite と javascript)
public class Everyday extends Image{ } | 重複のない乱数(ランダム)を生成する
- カテゴリ:PHPメモ

- タグ: php
- 次の記事: PHPでメールを送るときのメモ
- 前の記事: PHPとjavascriptの連携
Comments:2
- 匿名 10-04-17 (土) 0時ごろ
-
非常に参考になりました、どうもありがとうございます
- reoto 10-05-17 (月) 10時ごろ
-
コメントありがとうございます。お役に立てまして幸いです。
Trackback+Pingback:0
- TrackBack URL for this entry
- http://reoto.com/archives/227/trackback/
- Listed below are links to weblogs that reference
- PHPで重複しない(かぶらない)ランダムな整数というかつまりは乱数を取得する from ぼんずーず