../../image/benilogo.gifPHP4 について


PHP の rand( ) について。

 PHPのマニュアル rand() 

rand( ) 関数(乱数発生)の実験
頭ではわかっているけど 実際にどんなことになるのかを実行してみる。
test2/rand01.php
<?php
  echo "RAND_MAX =",getrandmax(),"  ---- ",rand(),"\n";
  echo "乱数 0 - 15 は rand(0,15) = ",rand(0,15),"\n";
  echo "サイコロは 1 - 6 rand(1,6) = ",rand(1,6),"\n";

?>
1回目 RAND_MAX =2147483647 ---- 809591897
乱数 0 - 15 は rand(0,15) = 6
サイコロは 1 - 6 rand(1,6) = 4
2回目 RAND_MAX =2147483647 ---- 1231594627
乱数 0 - 15 は rand(0,15) = 14
サイコロは 1 - 6 rand(1,6) = 3
n回目 RAND_MAX =2147483647 ---- 1057886067
乱数 0 - 15 は rand(0,15) = 9
サイコロは 1 - 6 rand(1,6) = 3

シードを固定すると
<?php

  srand(123456); ← シードを固定してしまうと

  echo "RAND_MAX =",getrandmax(),"  ---- ",rand(),"\n";
  echo "乱数 0 - 15 は rand(0,15) = ",rand(0,15),"\n";
  echo "サイコロは 1 - 6 rand(1,6) = ",rand(1,6),"\n";

?>
1回目 RAND_MAX =2147483647 ---- 1303402199
乱数 0 - 15 は rand(0,15) = 10
サイコロは 1 - 6 rand(1,6) = 2
2回目 RAND_MAX =2147483647 ---- 1303402199
乱数 0 - 15 は rand(0,15) = 10
サイコロは 1 - 6 rand(1,6) = 2
n回目 RAND_MAX =2147483647 ---- 1303402199
乱数 0 - 15 は rand(0,15) = 10
サイコロは 1 - 6 rand(1,6) = 2

当然のことだけど、ここで シード(乱数の種)を固定すると出てくる結果も固定されるのがわかる。
マニュアルのサンプルソースではシードを得るために usec ( マイクロ秒 ) を利用している。 なるほど マイクロ秒はそれこそ
マイクロ秒単位で異なった数値になる。
<?php

  srand(getmicrotime());

  echo "RAND_MAX =",getrandmax(),"  ---- ",rand(),"\n";
  echo "乱数 0 - 15 は rand(0,15) = ",rand(0,15),"\n";
  echo "サイコロは 1 - 6 rand(1,6) = ",rand(1,6),"\n";

function getmicrotime(){
    list($usec, $sec) = explode(" ",microtime());
    return ((float)$sec + (float)$usec);
    }

?>

1回目 RAND_MAX =2147483647 ---- 1279926523
乱数 0 - 15 は rand(0,15) = 9
サイコロは 1 - 6 rand(1,6) = 3
2回目 RAND_MAX =2147483647 ---- 2051270081
乱数 0 - 15 は rand(0,15) = 4
サイコロは 1 - 6 rand(1,6) = 6
n回目 RAND_MAX =2147483647 ---- 599521807
乱数 0 - 15 は rand(0,15) = 0
サイコロは 1 - 6 rand(1,6) = 5

なるほど こっちのほうがより正確な乱数になる。・・・ 正確な乱数? という表現も妙だけど シード を変えないと
乱数が乱数でなくなり一定のパターンになるらしい。 なのでシードをこんな形でとればパターン化されにくい乱数を発生することが出来る。

 それからマニュアルには オプション引数を省略した場合 0 と RAND_MAXの間の擬似乱数を返します。 と書いてあるが
RAND_MAXって何? 一応 getrandmax() で得られるのが RAND_MAX の意味だとは思うのだが何処にも書いてない。定数かと思って
調べてみましたが、それらしいのは見当たらない。 getrandmax() は固定されているみたい。 これを変えるには・・・
と思ったけれどこれを変える必要はないのだ。 そんなものを変えなくても rand( 0, 最大値) としてやればいいのだ。 

改良型乱数値を生成 として mt_rand( ) とか mt_getrandmax() とかあるようです。 早いらしい。

PHP4.2.0以降は srand() にシードを与える必要がない と書いてあるのでやってみた。 4.1.2なのでエラーになった。

Warning: Wrong parameter count for srand() in /home/rand01.php on line 11 ハハ やはりね。



















目次に戻る

2005/08/20start ********* Last Update 2006/11/12 16:21 JST

(C) Y.Kondou,2005,2006 All Rights, Reserved.
その他、お気づきの点がありましたら連絡先はこちらから