0

drand48 とプログラムの多くの部分を使用するプログラムがあります。プログラムの要件は、プログラムが異なる実行で異なる数を生成する必要がある部分を除いて、プログラムが毎回同じ数を生成する必要があるようなものです。

プログラムの最初に使用するsrand(time(NULL))と(多くのフォーラムで提案されているように)、プログラムを複数回実行するとすべての数値が変更されます。

関連するsrand(time(NULL))ループ内で (プログラムの実行全体で) 変更を行う場合、何も起こらず、乱数の変更もありません。

これに対する解決策はありますか???

4

3 に答える 3

0

基礎となるジェネレーターのパラメーターを調整したい場合は、jxh のアドバイスに従ってください。別のシードだけで満足する場合は、単純にdrand48のいとこを使用しerand48ます。

編集:バイオニックlibcを使用していますか? Undefined reference error - randでの議論により、bionic の rand() は drand48 とその仲間の単なるラッパーであることが明らかになったためです (バグ、バグ、バグ!)

于 2013-10-29T15:01:07.430 に答える
0

C ライブラリは、さまざまな乱数発生器をサポートしています。

drand48()は、式r n +1 = ( a · r n + c ) mod mに基づいて 48 ビットの疑似乱数値を生成する関数ファミリーに属します。ここで、a = 0xfdeece66d、c = 0xb、およびm = 2 48です。これらの関数に新しいランダム シードを設定するには、srand48()またはを使用する必要がありますseed48()

srand()を含む呼び出しの別のシステムに属しているため、これらの関数には影響しませんrand()drand48()ただし、これは、乱数を繰り返し可能にしたい場所や、乱数を毎回異なるものにしたい場所でsrand()引き続きrand()使用できることを意味します。

于 2013-10-28T19:54:52.407 に答える
0

GNU システムを使用している場合は、[drand48_r()][1]インターフェイスを使用してこれを実現できます。

__thread struct drand48_data drand48_same_buffer;
double drand48_same () {
    double x;
    drand48_r(&drand48_same_buffer, &x);
    return x;
}

GCC 拡張機能を使用して__thread、乱数状態バッファーのスレッドごとのインスタンスを作成しました。

于 2013-10-28T20:05:08.577 に答える