1. はじめに
C言語は、低レベルのシステムプログラミングやゲーム開発において、広く使用されているプログラミング言語です。中でも、「乱数生成」は多くの場面で利用されます。例えば、ゲーム内のランダム要素の作成、シミュレーション、暗号化、テストデータ生成など、多岐にわたる応用が可能です。
本記事では、C言語で範囲を指定した乱数生成の方法を、具体例とともに解説します。読者が乱数生成の仕組みを理解し、実際のプログラムに応用できるように構成しています。
2. C言語における乱数生成の基本
C言語では、乱数を生成するために標準ライブラリの <stdlib.h>
を使用します。rand()
関数は、0から RAND_MAX
(約2147483647)の範囲で整数乱数を生成しますが、同じシード値を使うと毎回同じ乱数が出力されます。
疑似乱数の生成とシード値の設定
乱数生成において重要な概念は「シード値」です。シード値は、乱数列の開始点を決定するもので、これを設定しないと毎回同じ乱数が生成されます。これを防ぐために、srand()
関数でシードを設定します。一般的には、time()
関数で現在の時刻をシードとして設定します。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand((unsigned int)time(NULL));
printf("%d\n", rand());
return 0;
}
これにより、プログラムを実行するたびに異なる乱数が生成されます。
3. 範囲を指定した乱数生成の方法
乱数生成で特定の範囲内の値を得たい場合、rand()
関数の結果に数学的操作を行う必要があります。範囲を指定した乱数生成の基本的な公式は次の通りです:
rand() % (max - min + 1) + min
これを使用すると、min
から max
までの整数範囲の乱数が生成されます。
サンプルコード:範囲指定の乱数生成
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int min = 1;
int max = 100;
srand((unsigned int)time(NULL));
int random_number = rand() % (max - min + 1) + min;
printf("Random number between %d and %d: %d\n", min, max, random_number);
return 0;
}
このコードは、1から100の範囲で乱数を生成し、出力します。
4. 実数範囲の乱数生成
実数の乱数生成では、rand()
関数と RAND_MAX
を利用してスケーリングします。0.0から1.0までの範囲の乱数を生成する場合、以下のコードを使用します。
実数範囲の乱数生成サンプル:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand((unsigned int)time(NULL));
double random_number = (double)rand() / RAND_MAX;
printf("Random number between 0.0 and 1.0: %f\n", random_number);
return 0;
}
このプログラムでは、0から1の範囲の乱数を生成しています。この技術を応用すれば、任意の実数範囲で乱数を生成することが可能です。たとえば、0.0から5.0の範囲で乱数を得たい場合、生成した値に5を掛けることができます。
5. 乱数の応用例
サイコロのシミュレーション
ゲーム開発などで乱数を利用する際には、サイコロのシミュレーションがよく例として挙げられます。以下は、1から6の範囲で乱数を生成し、サイコロの目をシミュレーションするコードです。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand((unsigned int)time(NULL));
int dice_roll = rand() % 6 + 1;
printf("Dice roll: %d\n", dice_roll);
return 0;
}
モンテカルロ法による円周率の近似
モンテカルロ法は、乱数を使って解析的に求めるのが難しい問題を近似する手法です。次のコードは、円周率を乱数を用いて近似する例です。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int n_trials = 1000000;
int n_inside = 0;
double x, y, pi;
srand((unsigned int)time(NULL));
for (int i = 0; i < n_trials; i++) {
x = (double)rand() / RAND_MAX;
y = (double)rand() / RAND_MAX;
if (x * x + y * y <= 1) {
n_inside++;
}
}
pi = 4.0 * n_inside / n_trials;
printf("Approximated π: %f\n", pi);
return 0;
}
モンテカルロ法を使って、乱数を生成し、その結果を基に円周率を計算する方法です。この手法は物理シミュレーションなどでよく使われます。
6. まとめ
この記事では、C言語で範囲を指定した乱数生成の方法を紹介しました。rand()
と srand()
の基本的な使い方から、実際に範囲を指定する方法、さらに実数乱数の生成や応用例までをカバーしました。乱数生成は、ゲーム開発やシミュレーションなど、多くの場面で活用される技術です。
今後のプロジェクトで、この記事の内容をぜひ活用してみてください。