ホームページ  >  記事  >  バックエンド開発  >  PHP ランダム関数 mt_rand() と rand() のパフォーマンス比較_PHP チュートリアル

PHP ランダム関数 mt_rand() と rand() のパフォーマンス比較_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-20 10:59:20980ブラウズ

PHP では、mt_rand() 関数と rand() 関数はどちらもシード データを設定して生成する必要があります。では、どちらの方がパフォーマンスが良いでしょうか。疑問がある場合は、テストしてください。 ​

例 1. mt_rand() の例

コードは次のとおりです コードをコピー

echo mt_rand() "n";
echo mt_rand() "n";

echo mt_rand(5, 15);
?>

上記の例の出力は次のようになります:

1604716014
1478613278
6

注: PHP 4.2.0 では、srand() または mt_srand() 関数を使用して乱数ジェネレーターをシードする必要はなくなり、自動的に行われるようになりました。

注: 3.0.7 より前のバージョンでは、最大は範囲を意味します。これらのバージョンで上記の例と同じ 5 から 15 までの乱数を取得するには、短い例は mt_rand (5, 11) です。

mt_srand()、mt_getrandmax()、および rand() を参照してください。


rand() 関数はランダムな整数を返します。

文法

rand(min,max)パラメータの説明
min、max はオプションです。乱数を生成する範囲を指定します。

手順

オプションのパラメーター min と max が指定されていない場合、 rand() は 0 から RAND_MAX までの擬似乱数の整数を返します。たとえば、5 から 15 までの範囲の乱数が必要な場合は、rand(5, 15) を使用します。
ヒントと注意事項
注: 一部のプラットフォーム (Windows など) では、RAND_MAX は 32768 のみです。 32768 より大きい範囲が必要な場合は、min パラメーターと max パラメーターを指定して RAND_MAX より大きい数値を生成するか、代わりに mt_rand() の使用を検討してください。

注: PHP 4.2.0 では、srand() 関数または mt_srand() 関数を使用して乱数ジェネレーターをシードする必要はなくなり、自動的に行われるようになりました。

注: 3.0.7 より前のバージョンでは、最大は範囲を意味します。これらのバージョンで上記の例と同じ 5 から 15 までの乱数を取得するには、短い例は rand (5, 11) です。


mt_rand() は本当に rand() より 4 倍速いのでしょうか?

この質問を念頭に置いて、オンラインで紹介文を読みながら自分でテストしました。テストは次のとおりです。

mt_rand() と rand() の比較テスト 1

テストコード:

コードは次のとおりです コードをコピー

$max = 100000;
$timeparts =explode(' ',microtime());
$stime = $timeparts[1].substr($timeparts[0],1);
$i = 0;
while($i ランド();
$i++;
}
$timeparts =explode(' ',microtime());
$etime = $timeparts[1].substr($timeparts[0],1);
$time = $etime-$stime;
echo "rand() を使用して {$time} 秒で生成された {$max} 個の乱数;
";

$timeparts =explode(' ',microtime());
$stime = $timeparts[1].substr($timeparts[0],1);
$i = 0;
while($i mt_rand();
$i++;
}
$timeparts =explode(' ',microtime());
$etime = $timeparts[1].substr($timeparts[0],1);
$time = $etime-$stime;
echo "mt_rand() を使用して {$time} 秒で生成された {$max} 個の乱数;
";
?>

結果:

最初のテスト
rand();
を使用して 0.024894952774048 秒で 100000 個の乱数が生成されました mt_rand();
を使用して、0.028925895690918 秒で 100000 個の乱数が生成されました 二次試験
rand();
を使用して、0.03147292137146 秒で 100000 個の乱数が生成されました mt_rand();
を使用して、0.02997088432312 秒で 100000 個の乱数が生成されました 3回目のテスト
rand();
を使用して、0.028102874755859 秒で 100000 個の乱数が生成されました mt_rand();
を使用して、0.02803111076355 秒で 100000 個の乱数が生成されました 4回目のテスト
rand();
を使用して、0.025573015213013 秒で 100000 個の乱数が生成されました mt_rand();

を使用して、0.028030157089233 秒で 100000 個の乱数が生成されました

この結果は数回のみ表示されますが、実際には 2 つが交互に変化することがわかります。

mt_rand() と rand() の比較テスト 2

私自身のテスト環境
オペレーティングシステム: Windows XP
アパッチ2.0
php 5.2.12
メモリ2G

コードは次のとおりです コードをコピー

関数 microtime_float()
{
List($usec, $sec) =explode(" ", microtime());
Return ((float)$usec + (float)$sec);
}
$time_start = microtime_float();
for($i=0; $i {
ランド();
}
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "rand() コスト $time 秒";


$time_start = microtime_float();
for($i=0; $i {
mt_rand();
}
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "mt_rand() コスト $time 秒";
?>

結果:
初めて
rand() コスト 0.25919604301453 秒
mt_rand() コスト 0.28554391860962 秒
2回目
rand() コスト 0.31136202812195 秒
mt_rand() コスト 0.28973197937012 秒
3回目
rand() コスト 0.27545690536499 秒
mt_rand() コスト 0.27108001708984 秒
4回目
rand() コスト 0.26263308525085 秒
mt_rand() コスト 0.27727103233337 秒

結果は同じで、2 つの所要時間は交互に変化します。実際には、2 つの間に大きな違いはありません。 phpのmt_rand()とrand()の比較結論

Linux 環境と Windows 環境の両方で、インターネット上で他の多くの人のテストを読んだことがありますが、ほとんどの人の結果は私と同じでした。両者にほとんど違いはありません。ただし、mt_rand() が 4 倍であると測定した人もいます。 rand() 倍よりも高速ですが、具体的なテスト環境が示されていないため、真か偽かを判断することはできません。私は今でも自分の結論を信じています。なぜなら、誰かが次のように mt_rand() と rand() を紹介しているのを見たからです:

では、なぜ PHP マニュアルには mt_rand() が rand() より 4 倍高速であると記載されているのでしょうか?

これは、mt_rand() で使用されているメルセンヌ ツイスター アルゴリズムが 1997 年のものであるため、10 年前では rand() との速度の差は (4 倍) でした。

rand() は 2004 年からアルゴリズムを使用しているため、速度に大きな違いはありません

上記のさまざまなテストから、それらの間に違いはありませんが、値はシステムによって異なる可能性があります。


http://www.bkjia.com/PHPjc/445615.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/445615.html技術記事 php では、mt_rand() 関数と rand() 関数は純粋な数値をランダムに生成できます。どちらもシード データを設定して生成する必要があるため、mt_rand() と rand() のパフォーマンスは向上します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。