rand() で常に同じ乱数列を取得するのはなぜですか?

種をまく必要があります。時間をシードすることをお勧めします:

srand()

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main ()
{
  srand ( time(NULL) );
  printf ("Random Number: %d\n", rand() %100);
  return 0;
}

rand() であるため、同じシーケンスが得られます。 srand() を呼び出さない場合、値 1 が自動的にシードされます .

編集

コメントが原因

rand() 0 から RAND_MAX までの数値を返します (標準ライブラリで定義されています)。モジュロ演算子 (% ) 割り算の余り rand() / 100 を返します .これにより、乱数が 0 ~ 99 の範囲内に強制されます。たとえば、0 ~ 999 の範囲の乱数を取得するには、rand() % 1000 を適用します。 .


rand() は 疑似乱数 を返します 数字。特定のアルゴリズムに基づいて数値を生成します。そのアルゴリズムの開始点は常に同じであるため、呼び出しごとに生成された同じシーケンスが表示されます。これは、プログラムの動作と一貫性を検証する必要がある場合に便利です。

srand で乱数発生器の「シード」を設定できます 関数 (プログラム内で srand を 1 回だけ呼び出す) rand() ジェネレーターから異なるシーケンスを取得する一般的な方法の 1 つは、シードを現在の時刻またはプロセスの ID に設定することです:

srand(time(NULL)); または srand(getpid()); プログラムの開始時に。

真のランダム性を生成することはコンピュータにとって非常に困難ですが、実際の非暗号関連の作業では、生成されたシーケンスを均等に分散しようとするアルゴリズムがうまく機能します.


man rand からの引用:

したがって、シード値がない場合、rand() シードを1(あなたの場合は毎回)と見なし、同じシード値rand()を使用します は同じ数列を生成します。