5

私が何を意味するのか説明しましょう。

少し前に、C# でプログラムを書いているときに、次のような間違いを犯しました。

int Randomize()
{
    Random r=new Random();
    return  r.Next(0,10);
}

C# では、これは間違いです。連続して数回呼び出されると、この関数は同じ値を返すからです。これは、Random コンストラクターが時間シードを使用し、呼び出し間の時間差が短すぎたためです (それを見つけるのに 1 時間かかりました:))。

現在、私はrand(...)phpで使用しています.2つのスクリプトが同時に実行されたとしても、出力が常に異なる必要があります。

この結果を得るために何かをしなければなりませんか、それともこのように動作するように設計されていますか?

4

2 に答える 2

9

andは常にランダムな結果を生成するためにandrand()mt_rand()呼び出します。しかし、これは php.net に関する興味深い投稿です。srand()mt_srand()

自動シード処理は現在の秒数で行われるように見えることに注意してください。これは、高速サーバーで複数回実行しても同じ結果が得られることを意味します。より頻繁に変更されるシードを使用して srand() を自分で呼び出すか、問題が発生していないように見える mt_rand() を使用してください。

だから、srandもっと頻繁に電話するか、mt_rand.

于 2012-06-26T09:00:27.333 に答える
4

機能についてmt_rand()...

http://php.net/manual/en/function.mt-srand.phpから

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

(PHP 5.2.1 の場合) PHP の Mersenne Twister 実装は、Richard Wagner による新しいシード アルゴリズムを使用するようになりました。同一のシードは、以前のバージョンと同じ値のシーケンスを生成しなくなりました。この動作が再度変更されることはないと予想されますが、それにもかかわらず、それに依存することは安全ではないと考えられています。

「 Mersenne Twister(MT)」疑似乱数生成アルゴリズム (およびC、C++、C# での実装)の説明を含むリンクは次のとおりです。

ここでは、PHP 5 でのこの関数の実装を見つけることができます。

そして、php_rand.h私はこれを見つけました:

#ifdef PHP_WIN32
#define GENERATE_SEED() (((long) (time(0) * GetCurrentProcessId())) ^ ((long) (1000000.0 * php_combined_lcg(TSRMLS_C))))
#else
#define GENERATE_SEED() (((long) (time(0) * getpid())) ^ ((long) (1000000.0 * php_combined_lcg(TSRMLS_C))))
#endif

これで、PHP のランダム関数が関数に依存していることがわかりtimeます...

于 2012-06-26T09:03:15.280 に答える