2

このチュートリアルのデイリー インスピレーションの部分で、彼は次のように述べています。

$quote = array(
1 => "Quote 1",
2 => "Quote 2",
3 => "Quote 3",
4 => "Quote 4",
5 => "Quote 5",
);
srand ((double) microtime() * 1000000);
$randnum = rand(1,5);
echo"$quote[$randnum]";

私は彼がここで(文字通り)何をしているのか理解できません:

srand ((double) microtime() * 1000000);

これが何をするのか理解するのを手伝ってもらえますか?

私はsrand()が次のことを知っています:

乱数発生器をシードする

しかし、なぜ彼はこれを行うのですか、それのポイントは何ですか?

ところで:私は次のようなもので行っていたでしょう:

<?php

$quotes = array(

"one",
"two",
"three"

);

echo $quotes[rand(0,count($quotes)-1)];
?>

これに問題はありますか?

4

4 に答える 4

5

ほとんどの乱数ジェネレーターは、実際には random ではありません。彼らが生成する次の数は、以前に生成された数からシンプルでありながら大きな関数を使用して計算されます。RNG をシードすると、作業する「前の」番号が与えられます。これは、多くの場合、毎回同じ既知の状態から開始するためです。

于 2010-12-06T16:32:13.673 に答える
4

PHP 4.2 より前では、ランダマイザーを実際に「ランダム」にするために「シード」する必要がありました。これで、ランダマイザーをシードしても意味がありません。

ドキュメントの状態:

注: PHP 4.2.0 以降、乱数ジェネレーターに srand() または mt_srand() をシードする必要はありません。これは自動的に行われるようになったためです。

参照: http://php.net/manual/en/function.srand.php

あなたのソリューションは同様に効果的です。

于 2010-12-06T16:32:41.493 に答える
2

これは単に 20 年前のチュートリアルのアーティファクトです (別のものを使用してください! ):

  • 乱数ジェネレーターは、すでに非常に長い間自動的にシードされています
  • mt_randrandよりも高速で「よりランダム」であるため、 よりも優先する必要があります(つまり、偏りのない確率変数をより多くの度数で提供します)。

PS:array_rand正確なキーを気にする必要がないため、ここで使用することをお勧めします。

echo $quotes[array_rand($quotes)];
于 2010-12-06T16:57:40.630 に答える
2

呼び出しの背後にある考え方srand()は、「より良い」乱数を提供することです。srand()しかし、呼び出しが「よりランダムな」番号をもたらすとは限りません。PHP はこれを内部的に行うため、PHP 4.2呼び出す必要はありません。srand()

于 2010-12-06T16:33:13.797 に答える