1. ホーム
  2. c

[解決済み] srand(time(NULL)) はシード値を十分に速く変更しない [duplicate] 。

2022-01-28 17:31:07

質問

C言語で簡単な乱数発生器を書きました。 int l は下限値であり int u は上限です。

うまくいくのですが、播種に関して質問があります。これをループで実行するとしたら。 time(NULL) は、シード値を素早く変更しないので、全く同じ乱数が連続して得られるのを防ぐことができません。

この問題に誰かアプローチしたことがあるのだろうかと思います。私がネットで見つけたすべての例は time(NULL) をシード値生成器として使用します。

int generateRandom(int l, int u)
{
   srand(time(NULL));

   int r = rand() % ((u - l) + 1);
   r = l + r;

   return r;
}

もし、これらのコードラインを互いに隣接して実行するとしたら、両方の Rand1Rand2 は全く同じになります。

printf("Rand1 = %d\n", generateRandom(10, 46));
printf("Rand2 = %d\n", generateRandom(10, 46));

解決方法は?

srand(time(NULL)) を一度だけ実行し、PRNG を初期化する必要があります。 アプリケーションの起動時にMainで実行します。

説明します。

PRNG(Pseudo-Random Number Generator)は、使用するアルゴリズムに依存した決定論的な数値列を生成します。 与えられたアルゴリズムは、与えられた出発点(シード)から常に同じシーケンスを生成します。 もしPRNGに明示的にシードを与えなければ、通常、アプリケーションを実行するたびに同じデフォルトのシードから開始され、結果として同じ数列が使用されることになります。

これを解決するには、アプリケーションを実行するたびに、PRNGに異なるシード(異なるシーケンスを与えるための)を自分で設定する必要があります。 通常のアプローチでは time(NULL) これは、現在の時間に基づいて種を設定します。 1秒以内に2つのアプリケーションを起動しない限り、異なる乱数列が保証されます。

新しい乱数を求めるたびにシーケンスをシードする必要はありません。 また、PRNGのアルゴリズムによっては、新しい乱数を生成するたびに播種し直すと、結果として乱数性が低下するような気がしています。