C言語で乱数生成を完全マスター|範囲指定と応用例を徹底解説

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() の基本的な使い方から、実際に範囲を指定する方法、さらに実数乱数の生成や応用例までをカバーしました。乱数生成は、ゲーム開発やシミュレーションなど、多くの場面で活用される技術です。

今後のプロジェクトで、この記事の内容をぜひ活用してみてください。