[解決済み] srand(time(NULL)) はシード値を十分に速く変更しない [duplicate] 。
質問
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;
}
もし、これらのコードラインを互いに隣接して実行するとしたら、両方の
Rand1
と
Rand2
は全く同じになります。
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のアルゴリズムによっては、新しい乱数を生成するたびに播種し直すと、結果として乱数性が低下するような気がしています。
関連
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み] c - 初期化がキャストなしでポインタから整数を作る、さらに2つのコンパイラーエラー
-
[解決済み】strcmpが機能しない
-
[解決済み】C言語におけるファイルスコープでの可変長配列の変更
-
[解決済み】C言語で浮動小数点例外(コアダンプ)発生
-
[解決済み] struct has no member named
-
[解決済み] エラー:整数が期待されるところで集約値が使用された
-
[解決済み】警告:引数「互換性のないポインタ型から」を渡す[デフォルトで有効]。
-
[解決済み】宣言指定子で2つ以上のデータ型がある場合のエラー【非公開
-
[解決済み】エラー:呼び出されたオブジェクトは、関数または関数ポインタではない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】strcmpが機能しない
-
[解決済み] Connect: ソケット以外でのソケット操作
-
[解決済み】 strcpyとstrdupの比較
-
[解決済み] [Solved] なぜこのようなエラーが発生するのでしょうか。「データ定義に型またはストレージクラスがない」?
-
[解決済み】C 未知の型名「my_structure」。
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み】sizeof float (3.0) vs (3.0f)
-
[解決済み】警告:式の結果が未使用の場合
-
[解決済み】whileループの時間複雑性(Big O)はどうやったらわかるの?
-
[解決済み] rollDice関数内でsrand(time(NULL))を呼び出すと問題が発生する。