【2026年7月最新】C言語の乱数(rand/srand)完全ガイド|範囲指定・初期化・実践サンプルとClaude Code活用術

【2026年7月最新】C言語の乱数(rand/srand)完全ガイド|範囲指定・初期化・実践サンプルとClaude Code活用術

C言語でゲームやシミュレーションを作っていると、必ず直面するのが「乱数の使い方」です。「rand()を使えばいい」とは知っているのに、「なぜか毎回同じ数字が出る」「1〜6の範囲に収めるにはどう書けばいい?」と詰まってしまった経験はありませんか。

C言語の乱数生成にはrand()とsrand()という2つの関数が使われますが、初学者がつまずきやすいのは「初期化なしでは毎回同じ値が返る」という仕様と、「範囲を指定するための計算式」の2点です。この記事では、rand/srandの仕組みを根本から理解したうえで、サイコロ・じゃんけん・配列シャッフルなど実践コード7つ以上を紹介します。

さらに後半では、Claude Codeを使ってC言語コードを自動生成する方法も解説します。「C言語のコードをAIに書かせる」という選択肢を知っておくことで、プログラミング学習も業務開発も大幅に効率化できます。

代表菅澤 代表菅澤
「乱数なんてrand()に決まっている」という認識でいると、業務や競技プログラミングで痛い目を見ることがあります。C言語のrand()は「疑似乱数」であり、品質には限界があります。この記事では基本から発展まで一気に解説するので、どのレベルの読者にも使える内容になっています。
AI鬼管理山崎 AI鬼管理山崎
rand()の仕組みを正しく理解すると、「なぜ毎回同じ数が出るのか」「なぜsrand(time(NULL))が必要なのか」が自然とわかるようになります。今日はその流れに沿って、順序立てて解説していきます。
✔️乱数・疑似乱数・シードの違いを正確に理解する
✔️rand()関数の使い方とRAND_MAXの意味
✔️srand(time(NULL))で初期化する必要性と仕組み
✔️n〜m の範囲で乱数を生成する計算式を完全マスター
✔️サイコロ・じゃんけん・配列シャッフルなどの実践コード
✔️よくあるバグと初学者の落とし穴の解説
✔️Claude CodeでC言語コードを自動生成する方法
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理
📌 この記事の結論
【2026年7月最新】C言語の乱数(rand/srand)完全ガイド|範囲指定・初期化・実践サンプルとClaude Code活用術
C言語のrand()/srand()関数を完全解説。RAND_MAX・範囲指定の計算式・time()で初期化する方法から、サイコロ・じゃんけん・乱数配列の実践コードまで網羅。Claude Codeを使ったC言語コード自動生成術も紹介。

01 乱数とは何か:真の乱数と疑似乱数の違い C言語のrand()を正しく使うためにまず知っておくべき基礎知識

乱数とは、ランダム(無作為)に生成される数のことです。ゲームのサイコロ・くじ引き・シミュレーション・暗号化など、コンピュータプログラムで「ランダムさ」が必要なあらゆる場面で使われます。しかし、コンピュータが生成する乱数は、厳密に言うと「真の乱数」ではなく「疑似乱数」です。

📚 用語解説

真の乱数(True Random Number):完全にランダムで、予測不可能な乱数。物理的なノイズ(CPU温度の揺らぎ・マウスの動き・大気ノイズなど)を元に生成される。暗号鍵の生成など、セキュリティが重要な場面で使われる。LinuxではOS がエントロピーを集めて /dev/urandom 等で提供する。

📚 用語解説

疑似乱数(Pseudo-Random Number):アルゴリズムによって計算で生成される「ランダムに見える数列」。同じシード(初期値)を与えれば、必ず同じ数列が再現される。C言語のrand()が生成するのはこの疑似乱数。統計的にはランダムに見えるが、原理的には予測可能。

C言語のrand()関数は線形合同法(LCG: Linear Congruential Generator)というアルゴリズムで動作しています。前の値に特定の係数を掛けて、特定の数で割った余りを次の値とする、というシンプルな計算を繰り返しています。

📚 用語解説

シード(Seed):疑似乱数生成の「初期値」。同じシードからは必ず同じ乱数列が生成される。srand()関数でシードを設定する。初期化なし(srand未呼び出し)の場合は、シードが固定値(通常1)に設定されるため、毎回同じ乱数列が返る。

重要なポイントを確認しておきましょう。C言語のrand()は、シード値が決まると生成される数列は完全に決定論的(deterministic)です。つまり、シード=1なら常に「41, 18467, 6334, 26500, ...」という同じ数列が生成されます。これが「初期化しないと毎回同じ数が出る」現象の原因です。

シード(初期値)を設定
srand()で設定
未設定ならシード=1
線形合同法で計算
前の値×係数+加数
を決まった数で割る
余りを乱数として返す
0〜RAND_MAX
の整数値
次の呼び出しに備える
今の値を次の計算の
「前の値」として保持
AI鬼管理山崎 AI鬼管理山崎
「毎回同じ数が出る」のはバグではなく、疑似乱数の設計上の特性です。シードが固定なら数列は固定。だから「毎回違う数を出すには、毎回違うシードを設定しなければならない」というわけです。ここを理解すれば、srand(time(NULL))の意味が自然とわかります。

02 rand()関数の基本:RAND_MAXとstdlib.h 乱数生成の中心となるrand()の仕様を正確に把握する

C言語のrand()関数は、<stdlib.h>ヘッダをインクルードすることで使えます。この関数は呼び出すたびに0からRAND_MAXまでの整数をひとつ返します。

📚 用語解説

RAND_MAX:rand()関数が返す乱数の最大値。stdlib.hで定義されるマクロ定数。C言語の規格ではRAND_MAXは少なくとも32767以上であることが保証されているが、多くの環境では2,147,483,647(2^31-1)または32767(2^15-1)になる。Linuxではgcc使用時は2,147,483,647が一般的。

2-1. rand()の最も基本的な使い方

#include 
#include    /* rand(), RAND_MAXを使うために必要 */

int main(void) {
    int i;

    /* rand()で5個の乱数を生成して表示 */
    for (i = 0; i < 5; i++) {
        printf("乱数[%d]: %d\n", i, rand());
    }

    /* RAND_MAXの値を確認 */
    printf("RAND_MAXの値: %d\n", RAND_MAX);

    return 0;
}

上記のコードを実行すると、0〜RAND_MAXの範囲の整数が5つ出力されます。重要なのは、srand()で初期化していない場合、何回実行しても同じ数が出力されるという点です。

💡 stdlib.hのインクルードを忘れずに

rand()とsrand()はどちらもに定義されているため、このヘッダのインクルードが必須です。インクルードを忘れると「暗黙の関数宣言」として扱われ、コンパイルは通っても実行時に予期しない値が返ることがあります(特に64bit環境で問題になりやすい)。

2-2. RAND_MAXの環境依存性を理解する

RAND_MAXの値は環境(OS・コンパイラ)によって異なります。特に注意が必要なのは、Windows(MSVC)の場合RAND_MAXが32767に設定されているケースが多い点です。これは2^15-1 = 32767で、C言語規格が要求する最小値です。

環境RAND_MAXの典型値備考
Linux (gcc)2,147,483,647 (2^31-1)高品質な乱数範囲
macOS (clang)2,147,483,647 (2^31-1)同上
Windows (MSVC)32,767 (2^15-1)範囲が狭く注意が必要
組み込み系実装依存マニュアル確認必須
⚠️ Windows環境でrand()を使う際の注意

WindowsのMSVCコンパイラでは RAND_MAX = 32767 です。これは最大でも32767種類の値しか生成できないことを意味します。たとえば「100万通りのランダムデータが必要」なケースでは RAND_MAX が足りなくなります。この場合は「rand() * (RAND_MAX + 1) + rand()」のように組み合わせるか、後述のより品質の高い乱数生成方法を使う必要があります。

代表菅澤 代表菅澤
RAND_MAXが32767と2,147,483,647では天と地の差があります。Windowsで開発した乱数コードをLinuxに移植すると挙動が変わることがあるのは、この差が原因です。ポータビリティを意識したコードでは、RAND_MAXの値を前提としない実装を心がけることが大切です。

03 srand()で乱数を初期化する:time()との組み合わせ 毎回異なる乱数列を得るための標準的な初期化パターン

rand()で毎回異なる乱数列を得るには、srand()関数でシードを設定する必要があります。srand()の引数として「毎回異なる値」を渡すことで、乱数列が変わります。

📚 用語解説

srand()(シード設定関数):rand()が使う乱数列の出発点(シード)を設定する関数。同じシードを渡すと同じ乱数列が生成される。一般的にはsrand(time(NULL))と書き、現在のUnixタイム(1970年1月1日からの経過秒数)をシードとして使う。プログラム起動ごとに時刻が変わるため、毎回違う乱数列になる。

3-1. srand(time(NULL))の標準的な書き方

#include 
#include    /* rand(), srand() */
#include      /* time() */

int main(void) {
    int i;

    /* 現在時刻をシードにして乱数列を初期化 */
    srand((unsigned int)time(NULL));

    /* rand()で5個の乱数を生成して表示 */
    for (i = 0; i < 5; i++) {
        printf("乱数[%d]: %d\n", i, rand());
    }

    return 0;
}

このコードを実行するたびに、異なる数列が出力されます。ポイントはtime(NULL)が現在のUnixタイム(エポック秒)を返すため、実行のたびに異なる値になることです。

📚 用語解説

Unixタイム(エポック秒):1970年1月1日00:00:00 UTC を基準に、経過した秒数を整数で表したもの。time(NULL)を呼ぶと現在のUnixタイムが返る。1秒ごとに1ずつ増えるため、異なる秒に実行するたびに異なるシードになる。

3-2. time.hのインクルードを忘れずに

time()関数を使うには<time.h>のインクルードが必要です。インクルードせずに使うと「暗黙の関数宣言」警告が出るか、誤った型でシードが設定されることがあります。また、srand()はプログラムの中で一度だけ呼ぶのが正しい使い方です。ループの中で何度も呼ぶのは典型的なミスです(次章で詳述)。

✔️#include <stdlib.h>: rand()とsrand()のために必要
✔️#include <time.h>: time()を使うために必要
✔️srand((unsigned int)time(NULL)): main関数の最初に一度だけ呼ぶ
✔️符号なし整数型(unsigned int)へのキャストを忘れない
AI鬼管理山崎 AI鬼管理山崎
srand(time(NULL))の「(unsigned int)」というキャストがついているのは、time_t型(通常64bitの符号付き整数)をsrand()が受け取るunsigned int型に変換するためです。環境によってはキャストなしでも動きますが、警告を出さないためにもキャストを付けるのが作法です。

3-3. 同じシードを使って再現可能なテストを行う

テストやデバッグの場面では、あえて固定のシードを使うことで再現可能な乱数列を得る場合もあります。これはゲームのリプレイ機能や、ランダム要素を含むアルゴリズムのデバッグに活用されます。

#include 
#include 

int main(void) {
    int i;

    /* シード=42で固定(テスト・デバッグ用) */
    srand(42);

    printf("シード=42での乱数列:\n");
    for (i = 0; i < 5; i++) {
        printf("  %d\n", rand());
    }

    /* 同じシードでリセット → 同じ数列が再現される */
    srand(42);
    printf("\nシード=42でリセット後(同じ数列):\n");
    for (i = 0; i < 5; i++) {
        printf("  %d\n", rand());
    }

    return 0;
}
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

04 乱数の範囲を指定する計算式を完全マスター 1〜6・0〜N・n〜mの各パターンを公式と例で完全網羅

rand()は0〜RAND_MAXの値を返しますが、実際に使いたいのは「1〜6(サイコロ)」「0〜99(パーセンテージ)」「50〜100(特定範囲)」といった限られた範囲の値です。この章では、任意の範囲で乱数を生成する計算式のパターンを完全に整理します。

乱数範囲指定の基本公式(必ず覚える)

n〜m の乱数 = rand() % (m - n + 1) + n

これだけ覚えていれば、あらゆる範囲の乱数に対応できます。
例: 1〜6 の場合 → rand() % (6 - 1 + 1) + 1 = rand() % 6 + 1

4-1. よく使うパターン別の計算式一覧

範囲計算式使用例
0 〜 N-1rand() % N配列インデックス 0〜(N-1)
0 〜 Nrand() % (N + 1)0〜Nの整数
1 〜 Nrand() % N + 1サイコロ1〜6: rand()%6+1
n 〜 mrand() % (m - n + 1) + n50〜100: rand()%51+50
0.0 〜 1.0 (小数)(double)rand() / RAND_MAX確率計算・比率
0.0 〜 N.0(double)rand() / RAND_MAX * NN以下の小数

4-2. 各パターンのコード例

#include 
#include 
#include 

int main(void) {
    srand((unsigned int)time(NULL));

    /* パターン1: 0〜N-1 (配列インデックス用) */
    int N = 10;
    int idx = rand() % N;
    printf("0〜9の乱数: %d\n", idx);

    /* パターン2: 1〜6 (サイコロ) */
    int dice = rand() % 6 + 1;
    printf("サイコロ(1〜6): %d\n", dice);

    /* パターン3: 50〜100 */
    int score = rand() % 51 + 50;
    printf("50〜100の乱数: %d\n", score);

    /* パターン4: -10〜10 (負の値を含む範囲) */
    int signed_val = rand() % 21 - 10;
    printf("-10〜10の乱数: %d\n", signed_val);

    /* パターン5: 0.0〜1.0 の小数 */
    double prob = (double)rand() / RAND_MAX;
    printf("0.0〜1.0の確率値: %.4f\n", prob);

    return 0;
}

📚 用語解説

剰余演算(%演算子):Cの%演算子は「割り算の余り」を返す。rand()%6は0〜5の値を返す(6の倍数の余りは0〜5)。+1することで1〜6に変換できる。この「剰余+オフセット」パターンが乱数の範囲指定の核心。

⚠️ 剰余法の分布の偏り(低品質な一様性)に注意

rand() % N という計算は、RAND_MAXがNで割り切れない場合、特定の値が他の値より若干多く出現する偏りが生じます。ゲームの効果音トリガーや簡単なシミュレーションでは問題ありませんが、統計的に厳密な一様分布が必要な場合(研究・暗号等)は、後述のより良い乱数生成方法を使う必要があります。

代表菅澤 代表菅澤
rand() % N の偏り問題は理論的には存在しますが、RAND_MAXが十分大きい(20億超)場合、実用上の差は無視できる水準です。ゲームや学習用プログラムなら気にする必要はありません。統計・暗号用途で問題になる話です。

05 実践サンプルコード集:サイコロ・じゃんけん・配列シャッフル コピー&ペーストで使える完全動作サンプル7本

ここまで学んだ知識を活かして、実際に動く実践サンプルを7本紹介します。学習の段階に合わせて参照・改造してください。

5-1. サイコロシミュレーション

#include 
#include 
#include 

int main(void) {
    int i, dice;
    srand((unsigned int)time(NULL));

    printf("=== サイコロシミュレーション(10回) ===\n");
    for (i = 0; i < 10; i++) {
        dice = rand() % 6 + 1;
        printf("第%2d回: %d\n", i + 1, dice);
    }
    return 0;
}

5-2. じゃんけんゲーム

#include 
#include 
#include 

int main(void) {
    const char *hands[] = {"グー", "チョキ", "パー"};
    int player_input, com_hand;

    srand((unsigned int)time(NULL));

    printf("じゃんけんゲーム(0=グー, 1=チョキ, 2=パー)\n");
    printf("あなたの手を入力: ");
    scanf("%d", &player_input);

    if (player_input < 0 || player_input > 2) {
        printf("無効な入力です\n");
        return 1;
    }

    com_hand = rand() % 3;
    printf("あなた: %s\n", hands[player_input]);
    printf("コンピュータ: %s\n", hands[com_hand]);

    if (player_input == com_hand) {
        printf("結果: 引き分け\n");
    } else if ((player_input + 1) % 3 == com_hand) {
        printf("結果: あなたの負け\n");
    } else {
        printf("結果: あなたの勝ち\n");
    }

    return 0;
}

5-3. 配列のランダムシャッフル(Fisher-Yatesアルゴリズム)

配列の要素をランダムに並び替える「シャッフル」は、ゲームの山札・クイズの選択肢順序などで頻繁に必要になります。最も品質の高いシャッフルアルゴリズムはFisher-Yatesアルゴリズムです。

📚 用語解説

Fisher-Yatesアルゴリズム:配列をランダムにシャッフルする最も有名で品質の高いアルゴリズム。末尾から先頭に向かって、各要素をそれ以前のランダムな位置の要素と入れ替える。計算量O(n)で、全ての順列が等確率で現れることが保証されている。ゲームの山札シャッフルや問題の順序ランダム化に使われる。

#include 
#include 
#include 

/* Fisher-Yatesアルゴリズムで配列をシャッフル */
void shuffle(int *arr, int n) {
    int i, j, temp;
    for (i = n - 1; i > 0; i--) {
        j = rand() % (i + 1);   /* 0〜i のランダムインデックス */
        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

int main(void) {
    int i;
    int deck[13] = {1,2,3,4,5,6,7,8,9,10,11,12,13}; /* トランプの1〜13 */

    srand((unsigned int)time(NULL));

    printf("シャッフル前: ");
    for (i = 0; i < 13; i++) printf("%d ", deck[i]);
    printf("\n");

    shuffle(deck, 13);

    printf("シャッフル後: ");
    for (i = 0; i < 13; i++) printf("%d ", deck[i]);
    printf("\n");

    return 0;
}

5-4. 乱数の統計検証(分布の確認)

#include 
#include 
#include 

int main(void) {
    int i, val;
    int count[6] = {0};   /* 1〜6の出現回数 */
    int TRIALS = 60000;   /* 試行回数 */

    srand((unsigned int)time(NULL));

    /* 60000回サイコロを振る */
    for (i = 0; i < TRIALS; i++) {
        val = rand() % 6;   /* 0〜5 */
        count[val]++;
    }

    printf("=== サイコロ %d 回の統計 ===\n", TRIALS);
    for (i = 0; i < 6; i++) {
        printf("%d の目: %5d 回 (%.1f%%)\n",
               i + 1, count[i], (double)count[i] / TRIALS * 100);
    }

    return 0;
}
💡 統計検証で一様分布を確認する

上のコードで各目が16.6%前後(= 100%÷6)であれば、rand()が一様に分布していることが確認できます。大幅に偏りが出る場合は、コンパイラ・環境・rand()の実装品質を疑う必要があります。

AI鬼管理山崎 AI鬼管理山崎
Fisher-Yatesアルゴリズムは「全ての順列が等確率で現れる」ことが数学的に証明されている方法です。よくある誤実装「rand()でインデックスを2つ選んで交換を繰り返す」では偏りが出るため、ゲーム開発や公平性が必要なシステムでは必ずFisher-Yatesを使ってください。

06 よくあるミスと落とし穴:初学者が必ずハマるポイント 典型的な5つのバグパターンとその修正方法

C言語の乱数は「基本はシンプル」なのに、実際にコードを書くと予期しない動作に出会いやすい領域です。以下に、初学者が必ずといっていいほどハマる5つのよくあるミスをパターン別に解説します。

ミス1: srand()をループの中で呼ぶ

⚠️ ループ内でsrand(time(NULL))を呼ぶのは最も典型的な誤り

ループが1秒以内に完了する場合、time(NULL)の値が変化しないため同じシード→同じ乱数が毎回返ります。srand()はmain関数の先頭で一度だけ呼ぶのが正しい。

/* NG例:ループ内でsrandを呼ぶ → 毎回同じ数が返る */
for (i = 0; i < 5; i++) {
    srand((unsigned int)time(NULL));  /* ← ここがNG */
    printf("%d\n", rand());
}

/* OK例:main関数の先頭で一度だけ呼ぶ */
srand((unsigned int)time(NULL));     /* ← ここで一度だけ */
for (i = 0; i < 5; i++) {
    printf("%d\n", rand());
}

ミス2: stdlib.hをインクルードしない

/* NG例:ヘッダなし(コンパイル警告またはエラー) */
int x = rand();   /* stdlib.hをインクルードしていない */

/* OK例 */
#include 
int x = rand();   /* 正しく動作する */

ミス3: rand()の戻り値の型を誤解する

rand()はint型(符号付き整数)を返します。double型に直接代入すると精度が下がる場合があるため、小数の乱数が必要なときは明示的にキャストが必要です。

/* NG例:doubleへの直接代入(精度の問題) */
double r = rand() / RAND_MAX;   /* 整数除算になって常に0.0! */

/* OK例:doubleにキャストしてから除算 */
double r = (double)rand() / RAND_MAX;   /* 0.0〜1.0 の小数 */

ミス4: 範囲指定の計算式のオフミスエラー

/* NG例:1〜6のつもりが0〜5になる */
int dice = rand() % 6;      /* 0〜5 ← 間違い */

/* OK例:1〜6の正しい計算 */
int dice = rand() % 6 + 1;  /* 1〜6 ← 正しい */

/* NG例:1〜100のつもりが0〜99になる */
int pct = rand() % 100;     /* 0〜99 ← 100は出ない */

/* OK例:1〜100 */
int pct = rand() % 100 + 1; /* 1〜100 ← 正しい */

ミス5: time.hをインクルードせずにtime()を使う

/* NG例:time.hなし */
srand(time(NULL));   /* time()が未定義のためエラーまたは警告 */

/* OK例 */
#include 
srand((unsigned int)time(NULL));  /* 正しく動作する */
✔️srand()はmain()の先頭で一度だけ呼ぶ
✔️#include <stdlib.h>#include <time.h>の両方を忘れずに
✔️0.0〜1.0の小数乱数は (double)rand() / RAND_MAX(キャストが必要)
✔️1〜N の乱数は rand() % N + 1(+1を忘れない)
✔️n〜m の乱数は rand() % (m-n+1) + n
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

07 発展:より良い乱数生成の選択肢 rand()の限界を超えるメルセンヌツイスターとOS提供の乱数

C言語の標準rand()は学習・簡易ゲームには十分ですが、統計シミュレーション・セキュリティ・大規模乱数生成では品質が不十分な場合があります。ここでは、より品質の高い乱数生成の選択肢を紹介します。

乱数生成方法品質速度主な用途移植性
rand()(C標準)低〜中高速学習・簡易ゲーム◎(ANSI C)
メルセンヌツイスター(MT19937)高速シミュレーション・ゲーム○(外部実装が必要)
/dev/urandom(Linux/macOS)最高(真乱数寄り)やや遅い暗号鍵・セキュリティ×(Unix系のみ)
arc4random()(BSD系)高速セキュリティ重視△(Unix系)
C++11のmt19937高速C++でのシミュレーション○(C++11以上)

📚 用語解説

メルセンヌツイスター(MT19937):1997年に松本眞・西村拓士が考案した疑似乱数生成アルゴリズム。周期が2^19937-1という天文学的に長く、統計的品質も極めて高い。rand()と異なり外部実装(ヘッダファイル)が必要だが、ゲーム開発・モンテカルロシミュレーション・機械学習でのランダム初期化などに広く使われる。

💡 セキュリティ用途には絶対にrand()を使わない

乱数を暗号鍵・トークン・パスワード生成に使う場合は、絶対にrand()を使ってはいけません。rand()は疑似乱数であり、シードと出力から次の値が予測可能です。Linuxなら getrandom() や /dev/urandom、Windowsなら BCryptGenRandom() などOSが提供するセキュリティ用乱数APIを使ってください。

用途を確認
学習/ゲーム/統計
/セキュリティ
どれか?
乱数品質を選択
学習→rand()
シミュレーション→MT
暗号→OS API
初期化方法を決める
rand→srand(time)
MT→適切な種
OS→不要
範囲指定して使用
rand() % N + n
のパターンを適用
代表菅澤 代表菅澤
ゲーム・シミュレーション・機械学習でC/C++を使う場合、メルセンヌツイスターは定番の選択肢です。C++ならstd::mt19937が標準ライブラリに含まれているので、ヘッダ実装も不要です。C言語の場合は、公式サイトで公開されているmt19937.cを組み込む方法が一般的です。

08 Claude CodeでC言語コードを自動生成する プロンプト一つで完動するCコードを数秒で得る方法

C言語の乱数処理は正確な知識が必要で、初心者が独力で書くとバグを踏みやすい領域です。この問題を解決する一つの選択肢として、Claude Codeを使ったC言語コードの自動生成があります。

Claude Codeは、日本語の指示文を入力するだけで、完全に動作するC言語のコードを生成してくれます。「srand(time(NULL))の初期化を含めて」「エラーハンドリング付きで」「コメントを日本語で」といった細かい要件も日本語で伝えられるため、C言語に慣れていない段階でも実用的なコードが得られます。

やりたいことClaude Codeへのプロンプト例
サイコロシミュレーション「C言語で、srand(time(NULL))で初期化して、1〜6のサイコロを10回振って結果と統計(各目の出現率)を表示するプログラムを書いて。日本語コメント付きで」
じゃんけんゲーム「C言語でじゃんけんゲームを作って。プレイヤーが0/1/2でグー/チョキ/パーを入力し、CPUはrand()でランダムに選ぶ。勝敗判定を表示。入力バリデーション付き」
配列シャッフル「C言語でFisher-Yatesアルゴリズムを使って整数配列をシャッフルする関数を書いて。引数は配列ポインタと要素数。使用例のmain関数も付けて」
乱数の範囲指定「C言語でn〜mの範囲の乱数を生成する関数random_in_range(int n, int m)を書いて。srand初期化はmainでしてある前提で。使用例も付けて」

8-1. Claude Codeを使うフロー

要件を整理する
何を・どの範囲で
・どんな機能が
必要か言語化
Claude Codeに指示
日本語で要件を
テキスト入力する
(詳細に書くほど良い)
コードを受け取る
数秒で完動Cコードが
生成される
追加指示も可能
コンパイル・動作確認
gccでビルドして
動作を確認。
修正は再指示
💡 エラーメッセージをそのままClaude Codeに貼り付けると修正してくれる

コンパイルエラーや実行時エラーが出た場合、エラーメッセージとソースコードをClaude Codeにそのまま貼り付けて「このエラーを直して」と伝えるだけで修正案が返ってきます。C言語の典型エラー(セグメンテーション違反・型不一致・未初期化変数等)への対処もほぼ1発で解決できます。

AI鬼管理山崎 AI鬼管理山崎
C言語の乱数コードは「動かし方はわかった、でもバグの原因がわからない」となりがちです。そういうときClaude Codeに「このコードでランダムな値が出ない理由を調べて」と投げると、srand()の位置・型のミス・ヘッダの漏れなどを一気に診断してくれます。

09 まとめ:C言語の乱数をマスターするためのロードマップ 学習の次のステップとAIを活用した効率化の方向性

この記事では、C言語のrand()/srand()を使った乱数生成を基礎から発展まで体系的に解説しました。

✔️乱数には真の乱数と疑似乱数があり、rand()は疑似乱数を生成する
✔️srand(time(NULL))をmain関数の先頭で一度だけ呼ぶことで毎回異なる乱数列になる
✔️n〜mの乱数 = rand() % (m-n+1) + n を覚えれば任意の範囲に対応できる
✔️ループ内でのsrand()呼び出し・キャスト忘れ・ヘッダ漏れが典型的なバグパターン
✔️統計・ゲーム開発にはメルセンヌツイスター、セキュリティにはOSのAPIを使う
✔️Claude Codeに日本語で指示するだけで完動するC言語コードが自動生成できる
代表菅澤 代表菅澤
C言語の乱数は、基本パターンを一度覚えてしまえば後は応用するだけです。「サイコロ→じゃんけん→シャッフル」と段階的にサンプルを自分で作って動かすことで、確実に身につきます。詰まったときはClaude Codeに投げてしまうのが最も効率的な学習法の一つです。

プログラミングの学習もAIを活用して効率化できます

C言語の学習はもちろん、業務でのプログラム開発や自動化スクリプト作成まで、Claude Codeを活用することで作業時間を大幅に短縮できます。
AI鬼管理では、Claude Codeを使った業務自動化の設計・導入支援を行っています。

AI鬼管理山崎 AI鬼管理山崎
「プログラミングができなくてもAIを使えば業務自動化できる」という状況が実際に来ています。まずは無料相談で、あなたの業務でAIが最も貢献できる領域を一緒に特定しましょう。

NEXT STEP

この記事の内容を、あなたのビジネスで
実践してみませんか?

AI活用を自社で回せるようになりたい方へ

AI鬼管理

Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。

よくある質問

Q. rand()を使うために必要なヘッダファイルは何ですか?

A. rand()とsrand()を使うには #include が必要です。time()でシードを設定する場合はさらに #include も必要です。どちらか一方のインクルード忘れが原因でコンパイル警告や実行時のおかしな動作が起きるケースが多いため、乱数コードを書くときは必ず2行ともインクルードしていることを確認してください。

Q. srand()をforループの中に入れたら毎回同じ数が出るのはなぜですか?

A. ループが1秒以内に完了する場合、time(NULL)の返り値(秒単位のUnixタイム)がループ全体で同じ値になるためです。srand()に同じ値が渡されると同じシードが設定されるため、rand()が返す値も同じになります。解決策はsrand()をforループの外・main関数の先頭で一度だけ呼ぶことです。

Q. 1〜100の乱数を生成する式はどう書きますか?

A. rand() % 100 + 1 と書きます。rand() % 100 は0〜99の値を返すため、+1することで1〜100になります。一般式は「n〜m の乱数 = rand() % (m - n + 1) + n」です。1〜100の場合は n=1、m=100 なので rand() % (100 - 1 + 1) + 1 = rand() % 100 + 1 となります。

Q. RAND_MAXの値はいくつですか?環境によって変わりますか?

A. RAND_MAXはC言語の規格で「少なくとも32767(2^15-1)以上」と定められていますが、実際の値は環境によって異なります。Linux(gcc)やmacOS(clang)では2,147,483,647(2^31-1)、Windows(MSVC)では32767が一般的です。自分の環境のRAND_MAXを確認するには printf("RAND_MAX=%d\n", RAND_MAX); と書いて実行してみてください。

Q. rand()は0.0〜1.0の小数を生成できますか?

A. rand()自体は整数値しか返しませんが、(double)rand() / RAND_MAX という式で0.0〜1.0の浮動小数点数を得られます。キャスト(double)が必要な理由は、rand()/RAND_MAXをキャストなしで書くと整数除算になり、常に0.0が返るためです。確率計算(50%の確率で何かをする)などに使えます。

Q. C言語のrand()はゲーム開発に使えますか?メルセンヌツイスターと比べると?

A. 簡単なゲームや学習用途ならrand()で十分です。ただし、本格的なゲーム開発(特にランダム要素が重要なRPGやローグライク)では、rand()の品質(周期・分布の均一性)に不満が出る場合があります。その場合はメルセンヌツイスター(MT19937)を使うとほぼすべての問題が解決します。C++を使えるなら std::mt19937 が標準ライブラリに含まれており手軽に使えます。

Q. 暗号用途でrand()を使っても安全ですか?

A. 安全ではありません。rand()は疑似乱数であり、シードさえわかれば次の値が予測可能です。パスワード・暗号鍵・セキュリティトークンの生成にはrand()を絶対に使ってはいけません。Linuxでは getrandom() システムコールや /dev/urandom、Windowsでは BCryptGenRandom() など、OSが提供するセキュリティ用乱数APIを使ってください。

AIAI鬼管理

AI鬼管理へのお問い合わせ

この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。

会社名を入力してください
業種を選択してください
お名前を入力してください
正しいメールアドレスを入力してください

1つ以上選択してください
1つ以上選択してください
月額コストを選択してください

約1時間のオンライン面談(Google Meet)です

空き枠を取得中...
面談日時を選択してください

予約確定後、Google Calendarの招待メールをお届けします。
しつこい営業は一切ございません。

監修 最終更新日: 2026年7月19日
菅澤孝平
菅澤 孝平 株式会社GENAI 代表取締役
  • AI業務自動化サービス「AI鬼管理」を運営 — Claude Code を活用し、経営者の業務を「AIエージェントに任せる仕組み」へ転換するパーソナルトレーニングを 伴走構築 で提供。日報・採用・問い合わせ対応・経費精算・議事録・データ集計・営業リスト等の定型業務を、AIに代行させる体制を経営者と一緒に作り込む
  • Claude Code 実装ノウハウを 経営者・法人クライアント に直接指導。生成AIを「便利ツール」ではなく 「業務を任せる存在」 として運用する手法を体系化
  • 「やらせ切る管理」メソッドの開発者。シンゲキ株式会社(2021年設立・鬼管理専門塾運営)にて累計3,000名以上の学習者を志望校合格に導いた管理メソッドを、AI × 経営者支援 に転用
  • 著書『3カ月で志望大学に合格できる鬼管理』(幻冬舎)、『親の過干渉こそ、最強の大学受験対策である。』(講談社)
  • メディア出演: REAL VALUE / カンニング竹山のイチバン研究所 / ええじゃないかBiz 他
  • 明治大学政治経済学部卒
現在は AI鬼管理(Claude Code活用の伴走型パーソナルトレーニング)を主事業とし、経営者と二人三脚で「AIに業務を任せる仕組み」を実装。「実行を強制する環境」を AI で構築する手法を、自社の実運用知見をもとに発信している。