1.乱数の性質
実は、rand()関数で生成される乱数は、ある数値をもとに一定の計算式に従って計算された擬似乱数であり、この数値を「シード」と呼びます。以下の図に示すように、シードと乱数の関係は正規分布になります。
シードはコンピュータを起動するたびにランダムですが、一度コンピュータを起動すると変化しません。つまり、シードはコンピュータを起動するたびに固定値となるため、次の式に従って計算された結果が得られます。 (生成される乱数) は固定です。
2.乱数の生成例
C 言語では、通常、<stdlib.h> ヘッダー ファイルで rand() 関数を使用して乱数を生成します。
int rand (void);
C言語にも乱数を取得できるrandom()関数がありますが、random()は標準関数ではなくVC/VSなどのコンパイラでは渡せないため、あまり使用されません。
rand() は 0 ~ RAND_MAX の間の整数をランダムに生成します。
以下は乱数生成の例です。
#include <stdio.h>
#include <stdlib.h>
int main(){
int a = rand();
printf("%d\n",a);
return 0;
}
3. タイムスタンプを使用して乱数を生成する
srand() 関数を使用して再シードすると、シードが変更されます。srand() の使用法は次のとおりです。
void srand (unsigned int seed);
unsigned int 型のパラメータが必要です。実際の開発では時間をパラメータとして扱うことができますが、毎回播種時間が異なると生成されるシードも異なり、最終的な乱数も異なります。
次のように、<time.h> ヘッダー ファイルの time() 関数を使用して、現在の時刻 (秒単位の精度) を取得します。
srand((unsigned)time(NULL));
乱数を生成する前にシードするように上記のコードを変更します。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int a;
srand((unsigned)time(NULL));
a = rand();
printf("%d\n", a);
return 0;
}
4.一定の範囲内で乱数を生成する
実際の開発では、一定の範囲の乱数が必要になることが多いのですが、大きすぎても小さすぎても要件を満たしません。モジュロ法を使用できます。
int a = rand() % 10; //产生0~9的随机数,注意10会被整除
上限と下限を指定したい場合:
int a = rand() % 51 + 13; //产生13~63的随机数
分析: モジュロは剰余です。rand()%51+13
これは 2 つの部分として考えることができます: rand()%51
0 から 50 までの乱数を生成し、+13
最小 a は 13 のみであり、最大は 50+13=63 であることが保証されます。
例:
13 ~ 63 の範囲の乱数を生成する完全なコード:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
int a;
srand((unsigned)time(NULL));
a = rand() % 51 + 13;
printf("%d\n",a);
return 0;
}