1. ホーム
  2. c

[解決済み] srand() - なぜ一度しか呼ばないのか?

2023-05-05 10:42:34

疑問点

この質問は、この質問のコメントに関するものです。 srandを初期化するおすすめの方法は? 最初のコメントでは srand() はアプリケーションの中で一度だけ呼ばれるべきです。なぜそうなのでしょうか?

どのように解決するのですか?

何を達成しようとしているかによります。

ランダム化は、開始値を持つ関数、すなわち .

つまり、同じ種であれば、常に同じ値の並びを得ることができるのです。

ランダムな値が必要なときに毎回シードを設定しようとすると、シードが同じ数字であれば、常に同じ "random"値を得ることができます。

シードは通常、現在の時刻から取られ、それは秒数で、次のようになります。 time(NULL) というように、乱数を取る前に必ずシードを設定すれば、srand/rand コンボを何度も呼び出す限り、同じ数値が得られるでしょう。 を同じ秒数で .

この問題を避けるため、srandはアプリケーションごとに1回だけ設定されます。なぜなら、2つのアプリケーションのインスタンスが同じ秒に初期化されることは疑わしいので、それぞれのインスタンスは異なる乱数列を持つことになります。

しかし、アプリ (特に短いもの、またはコマンド ライン ツールなど) を 1 秒間に何度も実行する可能性がわずかにあり、その場合、種を選択する他の方法に頼らなければなりません (異なるアプリケーション インスタンスで同じシーケンスを使用することが問題でない場合)。しかし、私が言ったように、それは使用するアプリケーションのコンテキストに依存します。

また、精度をマイクロ秒に上げてみるのもいいかもしれません(同じシードの可能性を最小にする)。 sys/time.h ):

struct timeval t1;
gettimeofday(&t1, NULL);
srand(t1.tv_usec * t1.tv_sec);