Home > PHPメモ > PHPで重複しない(かぶらない)ランダムな整数というかつまりは乱数を取得する

PHPで重複しない(かぶらない)ランダムな整数というかつまりは乱数を取得する

  • 2009-03-20 (金)

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を作って入れてやります。

  1.  <?php
  2.  //srandを使って乱数発生器を初期化してからrandで0から5の範囲内の乱数を得る
  3.  srand((double) microtime() * 1000000);
  4.  $random_number = rand(0, 5);、
  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.では重複しない乱数をある範囲内で必要なだけ取得するには?

  1.  <?php
  2.  $rand_ar = range($min , $max);
  3.  //range()を使い$min から $max までの整数を値に持つ配列を$rand_arに取得
  4.  
  5.  shuffle($rand_ar);
  6.  //shuffle()を使い$rand_arの並びをランダムにする
  7.  
  8.  // $rand_ar[0]から$rand_ar[$num]には重複しない整数がランダムな順番で入っているので
  9.  // 先頭から順番に好きなだけ取得することでランダムな整数を必要なだけ取得できる
  10.  ?>

ってことで発生させるのはこの2行で終わりです。
rand()は絶対使うと思ったのでおさらいしましたが・・・使いませんでした!

実は私も他の多くの方々のようにrand() もしくは mt_rand() を使って
「既に取得した整数かチェックしながら乱数を必要数集め続ける(既に取得していたら,発生させなおす)」
という明らかに無駄な処理が含まれている関数を作ってしまっていたのでした。
上記方法で納得できずに調べなおしたところこの方法を見つけたので今回差し替えてご紹介しました。

ちなみに,shuffleを使う方法もphp4.2.0未満の場合はsrandで乱数発生器を初期化しましょう。
その場合は

  1.  <?php
  2.  $rand_ar = range($min , $max);
  3.  srand((double)microtime()*1000000);// srandで初期化してあげましょう
  4.  shuffle($rand_ar);
  5.  ?>

であとは同じくarray $rand_ar から取得できます。

3.その他・・・

その他色々なランダムな何かを作る方法が英語ですがこちらのコメント欄で白熱していて参考になります。
PHP: rand - Manual

16桁で5万個なら?
phpで ・重複しない ・ランダムな16桁の数字 を作りたいです。 5万個ぐらい作りたいです。 md5だと英字も入ってしまうし・・・ 良い方法を教えてください。 .. - 人力検索はてな

多言語 (flashlite と javascript)
public class Everyday extends Image{ } | 重複のない乱数(ランダム)を生成する

  • タグ:

Comments:2

匿名 10-04-17 (土) 0時ごろ

非常に参考になりました、どうもありがとうございます

reoto 10-05-17 (月) 10時ごろ

コメントありがとうございます。お役に立てまして幸いです。

Comment Form
Remember personal info

Trackback+Pingback:0

TrackBack URL for this entry
http://reoto.com/archives/227/trackback/
Listed below are links to weblogs that reference
PHPで重複しない(かぶらない)ランダムな整数というかつまりは乱数を取得する from ぼんずーず

Home > PHPメモ > PHPで重複しない(かぶらない)ランダムな整数というかつまりは乱数を取得する

タグクラウド
911 98 Acl ADSL ajax apache api bake BSE cakephp centOS css C言語 database db dom ECCUBE eclipse EM exec php google html javascript json lan linux mbr model mysql nec nic oscommerce password pbr pbs pci PDF pear php php4.3.9 phpexec phpのエラーコード pppoe SMAP Smarty SPAM sql sqlite svn Synergy TCP/IP ubuntu validation VMwarePlayer windows windowsXP wordpress xampp xml えひめAI くしゃみ ひかり ひかり接続 アキヒト イカ インデックス エコ エラー オリンピック カスタマイズ カスタムフィールド カタカナ キーワードEYE シュレッダー ジーオーグループ スクリプト セキュリティ センター直前 ソルトレイク タコ ダイアルアップ ダウンタウン テレビ テレホーダイ テロ デバッグ デュアルブート データサルベージ ネットショップ ネットワーク ハイライト バイク バックアップ バージョン切り替え フリーズ ブックオフ プラグイン プリンタ プログラミング プーチン マイケルジャクソン マコーレ・カルキン メモ メール リキッドレイアウト リサイクル レイアウト レンタルサーバー 不満 事故 人生 仮想化 再生紙 別れ 加圧式ボールペン 受験 哲学 夏目漱石 夢十夜 家族 島谷ひとみ 怠惰 怪奇 感謝 技術メモ 文字 文字コード 料理 正月 歯痛 焼き豚 牛肉 理科年表 環境問題 生きる 画像 示談金 視覚 言葉 降水量 青画面 風邪 飲みすぎ google
検索
Feeds
Ads

Return to page top