2016-04-03 4 views
-1

乱数を生成する場合、最初にsrand(int seed)を呼び出して種を生成し、次にrand(void)を呼び出します。擬似ランダム関数がシードを引数として直接取るのはなぜですか?

私の質問は、なぜただ一つの機能をrand(int seed)として直接使用しないのですか?

C標準には、ライブラリ関数がsrand関数を呼び出していないかのように実装が振舞うもの

を言って、私は理解していない引用符を持っています。

私はこの文と関係があるかどうかはわかりません。

標準はまた、私は静的変数を使用する理由を理解しない、実装例を示します:

static unsigned long int next = 1; 
int rand(void) // RAND_MAX assumed to be 32767 
{ 
    next = next * 1103515245 + 12345; 
    return (unsigned int)(next/65536) % 32768; 
} 
void srand(unsigned int seed) 
{ 
    next = seed; 
} 
+2

'srand()'(と 'rand()'自体を呼び出さないライブラリに関する部分はおそらく、 'rand()'によって生成されたシーケンスの再現性を保証することを意図しています。 – EOF

+0

マニュアルページは、記述されている機能を使用する前に読み込まれている必要があります。代わりに、それらがどのように使用されるのかを記述したCの本を読むことができます。一度読んだら、なぜあなたの質問の提案が - よく - 悪い考えであるのかはっきりしています。 – Olaf

答えて

3

あなたは、あなたがrandを呼び出すsrand毎回呼び出すことになっていません。実際には、同じシードが毎回同じシーケンスを提供するので、非常に悪い考えです。一定の値を生成することになります。

srandは、ランダムな値の新しいシーケンスの生成を開始するときに呼び出す必要があります。典型的なケースでは、それは一度、プログラムの初めです。

その後、randを呼び出すたびに、シーケンスの次の番号が返されます。それでここには静的変数があります:randは、それが以前に残った場所を見つけ出し、次の番号を生成することができます。

関連する問題