- ベストアンサー
乱数が常に一定
$seed = (状況によって変わる数字20桁ぐらい); mt_srand($seed); $ransuu = mt_rand(0,100); 上記のソースだと、$ransuuが常に85になってしまいます。 $seedに数字がきちんと入っている事は確認しています。 どのように直せば良いのでしょうか?よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ああ、なるほどその目的ならばseedを設定しないと役に立たないですね。 >>具体的にはどういう値でしょうか? >入力された文字をMD5でハッシュを出し、その中から英字を取り除いた物を使っています。 >例 >8030273364438475050 >787376380711342160108 >52704194757033429714311 マニュアルを見ると、mt_srandの引数は int を取ると記述されています。 よくある32bit環境ではint の最大値は 2^31-1 (2147483647)ですが 上記の例ではいずれもこの最大値を越えています。 んで、ちょっと次のようなスクリプトを書いて確かめてみたところ <?php <?php $ary = array( 8030273364438475050, 787376380711342160108, 52704194757033429714311, pow(2,8), pow(2,16), pow(2,24), pow(2,31), pow(2,32)-1, pow(2,32), pow(2,32)+1, pow(2,36), pow(2,36)+pow(2,4), pow(2,36)+pow(2,8), pow(2,36)+pow(2,16), pow(2,40)); print("start\n"); //print_r($ary); foreach ($ary as $v) { print("$v =>\n"); mt_srand($v); for ($count=0; $count<=20; $count++) { print(mt_rand(1, 100)); print(", "); } print("\n"); } start 8.0302733644385E+18 => 85, 23, 51, 8, 20, 60, 33, 25, 53, 50, 98, 21, 45, 9, 28, 38, 4, 25, 70, 25, 35, 7.8737638071134E+20 => 45, 60, 72, 16, 61, 86, 55, 85, 43, 63, 36, 62, 56, 30, 11, 6, 4, 74, 62, 48, 80, 5.2704194757033E+22 => 45, 60, 72, 16, 61, 86, 55, 85, 43, 63, 36, 62, 56, 30, 11, 6, 4, 74, 62, 48, 80, 256 => 96, 84, 41, 53, 80, 51, 92, 32, 97, 98, 41, 36, 62, 14, 6, 43, 20, 94, 38, 23, 38, 65536 => 85, 59, 62, 82, 50, 66, 62, 34, 52, 28, 24, 81, 86, 24, 71, 86, 92, 55, 36, 29,44, 16777216 => 20, 10, 51, 81, 92, 16, 53, 28, 1, 51, 80, 19, 26, 19, 27, 30, 65, 33, 61, 30, 60, 2147483648 => 85, 67, 18, 37, 78, 85, 55, 60, 67, 58, 71, 31, 59, 96, 53, 85, 98, 28, 32, 60,17, 4294967295 => 10, 89, 92, 44, 22, 47, 79, 78, 2, 29, 3, 51, 60, 30, 86, 70, 91, 84, 56, 66, 99, 4294967296 => 45, 60, 72, 16, 61, 86, 55, 85, 43, 63, 36, 62, 56, 30, 11, 6, 4, 74, 62, 48, 80, 4294967297 => 58, 1, 73, 94, 100, 87, 71, 100, 86, 77, 92, 61, 19, 62, 66, 34, 40, 94, 47, 85, 42, 68719476736 => 45, 60, 72, 16, 61, 86, 55, 85, 43, 63, 36, 62, 56, 30, 11, 6, 4, 74, 62, 48, 80, 68719476752 => 79, 68, 49, 6, 56, 70, 96, 14, 64, 30, 78, 86, 69, 36, 17, 14, 93, 16, 6, 32, 44, 68719476992 => 96, 84, 41, 53, 80, 51, 92, 32, 97, 98, 41, 36, 62, 14, 6, 43, 20, 94, 38, 23, 38, 68719542272 => 85, 59, 62, 82, 50, 66, 62, 34, 52, 28, 24, 81, 86, 24, 71, 86, 92, 55, 36, 29,44, 1099511627776 => 45, 60, 72, 16, 61, 86, 55, 85, 43, 63, 36, 62, 56, 30, 11, 6, 4, 74, 62, 48, 80, 2^32 以上は 32bit int に収まる範囲に剰余を取った値を使っているように見えます。 ということで、 >入力された文字をMD5でハッシュを出し、その中から英字を取り除いた物を使っています。 もうちょっとがんばって、32bit intに収まる範囲に縮めてみてはどうでしょうか。
その他の回答 (1)
- sakusaker7
- ベストアンサー率62% (800/1280)
現在ではmt_srand でseedを与えなくても勝手に設定してくれるみたいですよ。 PHP: mt_srand - Manual "バージョン 説明 4.2.0 以降 seed がオプションとなり、 省略した場合はデフォルトでランダムな値が設定されるようになりました。 5.2.1 以降 PHP の Mersenne Twister 実装は、Richard Wagner による新たなシード生成アルゴリズムを使用するようになりました。 これまでのバージョンのように、 同じ値のシーケンスで同じシードが生成されることはなくなりました。 この振る舞いが今後変わることはないでしょうが、 この振る舞いに頼ってしまってはいけません。" http://php.mirror.camelnetwork.com/manual/ja/function.mt-srand.php >状況によって変わる数字20桁ぐらい 具体的にはどういう値でしょうか?
お礼
回答ありがとうございます。 >現在ではmt_srand でseedを与えなくても勝手に設定してくれるみたいですよ。 seedは設定しなくてはだめなんですよ。というのも、昔(?)はやった脳内メーカー的な物をプログラミングの勉強をかねて作っていて、同じ名前なのに毎回違う答えが返ってきてはだめなので… >具体的にはどういう値でしょうか? 入力された文字をMD5でハッシュを出し、その中から英字を取り除いた物を使っています。 例 8030273364438475050 787376380711342160108 52704194757033429714311 こんな感じです。よろしくお願いします。
補足
サーバー環境は OS…FreeBSD 6.1-RELEASE-p23 i386 Webサーバソフトウェア…Apache 1.3.39 PHPのバージョン 5.2.5 です。
お礼
わざわざスクリプトまでお書きいただき、分かりやすく教えてくださりありがとうございます。これからやってみます。
補足
substrを使って9文字切り取ってそれをseedにしたら見事解決できました。ありがとうございました。