【6日でできるC言語入門】乱数関連の関数

 C言語には、ゲームやシミュレーションなど様々な場面で役立つ乱数生成のための標準ライブラリ関数が用意されています。
乱数(ランダムな数値)は、サイコロの出目、くじ引き、データのシャッフルなど「予測不能な値」を必要とするプログラムに欠かせません。
 ここでは、乱数生成関数の基本的な使い方・特徴を学び、実用的なプログラム例とともに詳しく解説します。

1.C言語の乱数ライブラリの基本

1.1. 代表的な乱数関連関数

C言語の標準ライブラリ(stdlib.h, time.h)には、以下のような乱数生成関連関数があります。

関数名機能・説明使い方例
rand()0~RAND_MAX(定数)の整数乱数を返すint x = rand();
srand()乱数の初期値(シード値)を設定。毎回異なる乱数を得るのに必要srand((unsigned)time(NULL));
time()現在時刻(エポックからの秒数)を返すtime(NULL)

ポイント

  • rand()だけを使うと、毎回同じ乱数系列になるため、srand()で初期化することが重要です。
  • シード値には通常、time(NULL)の値(現在時刻)を用います。

1.2. サンプル:1~6のサイコロを2回振る

プロジェクト/ファイル名: Lesson46_1/main.c

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

int main(void) {
    int dice1, dice2;

    // 乱数の初期化(シード設定)
    srand((unsigned)time(NULL));

    // 1~6の乱数を生成
    dice1 = rand() % 6 + 1;
    dice2 = rand() % 6 + 1;

    printf("サイコロの目1: %d\n", dice1);
    printf("サイコロの目2: %d\n", dice2);
    printf("合計: %d\n", dice1 + dice2);

    return 0;
}

実行例(毎回結果が変化)

サイコロの目1: 4
サイコロの目2: 1
合計: 5

2.乱数の範囲と応用

2.1. 乱数の範囲指定方法

範囲書き方例(n=10 の場合)生成される値
1~nrand() % n + 1rand() % 10 + 11~10
0~nrand() % (n + 1)rand() % 110~10
a~brand() % (b-a+1)+arand() % 6 + 33~8

解説

  • %(剰余演算子)を使って範囲を調整し、必要なら「+1」や「+a」を加えることで好きな範囲の乱数が得られます。

2.2. サンプル:3~8の乱数を5回表示

プロジェクト/ファイル名: Lesson46_2/main.c

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

int main(void) {
    int i, num;
    srand((unsigned)time(NULL));
    for (i = 0; i < 5; i++) {
        num = rand() % 6 + 3; // 3~8の乱数
        printf("乱数%d回目: %d\n", i+1, num);
    }
    return 0;
}

実行例

乱数1回目: 4
乱数2回目: 8
乱数3回目: 5
乱数4回目: 7
乱数5回目: 3

3.乱数生成に関する補足事項

3.1. srandを忘れると…?

  • srandでシード値を設定しないと、プログラムを実行するたびに同じ順番の乱数が出ます(テスト用途では逆に便利)。
  • 本当に「毎回バラバラ」の値がほしい場合は、必ずsrand((unsigned)time(NULL));などで初期化しましょう。

3.2. RAND_MAXとは

  • rand()が返す最大値(環境依存、通常32767や2147483647)がRAND_MAXです。
  • 非常に大きな乱数がほしい場合はrand()のまま使ってもOKです。

3.3. 注意点と発展

注意点内容
真の乱数ではないC言語のrand()は「擬似乱数」。本当のランダムではない。
マルチスレッドや暗号用途にはより高度な乱数生成手法が必要(例:random()や外部API等)

まとめ

  • C言語の乱数生成は、rand()srand()time()を組み合わせて使うのが基本です。
  • %を使うことで、好きな範囲の乱数を簡単に作ることができます。
  • 必要に応じてサイコロ・くじ引き・カードシャッフルなどに応用できます。