[C言語] 指定した範囲の乱数を生成するプログラムの書き方を解説

C言語で指定した範囲の乱数を生成するには、標準ライブラリのstdlib.hに含まれるrand()関数を使用します。

この関数は0からRAND_MAXまでの整数を返しますが、特定の範囲の乱数を得るためには、生成された値を適切にスケーリングする必要があります。

例えば、minからmaxまでの範囲の乱数を生成するには、rand() % (max - min + 1) + minという式を使用します。

また、乱数のシードを設定するためにsrand()関数を用いることで、異なる乱数列を生成することが可能です。

この記事でわかること
  • C言語での乱数生成の基本的な計算式
  • 1から10までの乱数を生成する方法
  • 負の範囲を含む乱数の生成方法
  • サイコロのシミュレーションやカードゲームのシャッフルの実装例
  • rand() 関数の特性と乱数の精度を上げる方法

目次から探す

指定した範囲の乱数を生成する方法

C言語で乱数を生成する際、特定の範囲内で乱数を生成する方法を理解することは非常に重要です。

ここでは、範囲を指定するための計算式や具体的な例を通じて、乱数生成の方法を解説します。

範囲を指定するための計算式

C言語で乱数を生成する際、rand()関数を使用しますが、この関数は0から RAND_MAX までの整数を返します。

特定の範囲 [min, max] の乱数を生成するためには、以下の計算式を使用します。

random_number = (rand() % (max - min + 1)) + min;
  • rand() % (max - min + 1) は、0から (max - min) までの乱数を生成します。
  • + min をすることで、乱数の範囲を [min, max] に調整します。

例:1から10までの乱数を生成する

1から10までの乱数を生成する具体的な例を示します。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    // 乱数の種を初期化
    srand(time(NULL));
    // 1から10までの乱数を生成
    int min = 1;
    int max = 10;
    int random_number = (rand() % (max - min + 1)) + min;
    // 生成された乱数を表示
    printf("生成された乱数: %d\n", random_number);
    return 0;
}
生成された乱数: 7

このプログラムでは、srand(time(NULL)) を使用して乱数の種を初期化しています。

これにより、プログラムを実行するたびに異なる乱数が生成されます。

負の範囲を含む乱数の生成

負の範囲を含む乱数を生成する場合も、基本的な計算式は同じです。

例えば、-5から5までの乱数を生成する場合を考えます。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    // 乱数の種を初期化
    srand(time(NULL));
    // -5から5までの乱数を生成
    int min = -5;
    int max = 5;
    int random_number = (rand() % (max - min + 1)) + min;
    // 生成された乱数を表示
    printf("生成された乱数: %d\n", random_number);
    return 0;
}
生成された乱数: -3

このプログラムでは、負の数を含む範囲で乱数を生成しています。

minmax の値を調整することで、任意の範囲の乱数を生成することが可能です。

応用例

乱数生成は、さまざまなプログラムで応用されています。

ここでは、乱数を利用した具体的な応用例をいくつか紹介します。

サイコロのシミュレーション

サイコロを振るシミュレーションは、乱数生成の典型的な応用例です。

サイコロは通常6面で、1から6までの数が出ることを想定します。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    // 乱数の種を初期化
    srand(time(NULL));
    // サイコロの目を生成
    int min = 1;
    int max = 6;
    int dice_roll = (rand() % (max - min + 1)) + min;
    // サイコロの目を表示
    printf("サイコロの目: %d\n", dice_roll);
    return 0;
}
サイコロの目: 4

このプログラムは、サイコロを振った結果をシミュレートし、1から6の間でランダムな数を生成します。

カードゲームのシャッフル

カードゲームでは、デッキをシャッフルするために乱数を使用します。

ここでは、簡単なシャッフルアルゴリズムを示します。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define DECK_SIZE 52
void shuffle(int *deck, int size) {
    for (int i = 0; i < size; i++) {
        int j = rand() % size;
        // カードを交換
        int temp = deck[i];
        deck[i] = deck[j];
        deck[j] = temp;
    }
}
int main() {
    // 乱数の種を初期化
    srand(time(NULL));
    // デッキを初期化
    int deck[DECK_SIZE];
    for (int i = 0; i < DECK_SIZE; i++) {
        deck[i] = i + 1;
    }
    // デッキをシャッフル
    shuffle(deck, DECK_SIZE);
    // シャッフルされたデッキを表示
    printf("シャッフルされたデッキ: ");
    for (int i = 0; i < DECK_SIZE; i++) {
        printf("%d ", deck[i]);
    }
    printf("\n");
    return 0;
}
シャッフルされたデッキ: 12 5 23 1 45 34 2 19 50 3 ...

このプログラムは、52枚のカードデッキをシャッフルし、ランダムな順序でカードを並べ替えます。

ランダムな配列の生成

ランダムな配列を生成することは、テストデータの作成やアルゴリズムの検証に役立ちます。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ARRAY_SIZE 10
int main() {
    // 乱数の種を初期化
    srand(time(NULL));
    // ランダムな配列を生成
    int array[ARRAY_SIZE];
    for (int i = 0; i < ARRAY_SIZE; i++) {
        array[i] = rand() % 100; // 0から99までの乱数
    }
    // 生成された配列を表示
    printf("ランダムな配列: ");
    for (int i = 0; i < ARRAY_SIZE; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
    return 0;
}
ランダムな配列: 42 17 93 58 6 29 74 85 33 90

このプログラムは、0から99までの乱数を含む10個の要素を持つ配列を生成します。

ランダムな配列は、さまざまな用途で利用可能です。

よくある質問

rand() 関数は本当にランダムなのか?

rand()関数は擬似乱数生成器を使用しており、完全にランダムな数を生成するわけではありません。

擬似乱数は、特定のアルゴリズムに基づいて生成されるため、同じ初期条件(シード値)を与えると同じ乱数列が生成されます。

したがって、rand()関数は真の乱数ではなく、あくまで擬似的な乱数を生成するものです。

なぜ毎回同じ乱数が生成されるのか?

プログラムを実行するたびに同じ乱数が生成されるのは、srand()関数でシード値を設定していないためです。

rand()関数はデフォルトで同じシード値を使用するため、同じ乱数列が生成されます。

異なる乱数を生成するには、srand(time(NULL)) のように、現在の時刻をシード値として設定することが一般的です。

乱数の精度を上げる方法はあるのか?

rand()関数の精度を上げるためには、より高精度な乱数生成器を使用することが考えられます。

C言語では、rand() よりも精度の高い乱数生成器として、random()mt19937(メルセンヌ・ツイスタ)などのライブラリを使用することができます。

これらのライブラリは、より広範な範囲で高精度な乱数を生成することが可能です。

まとめ

この記事では、C言語で指定した範囲の乱数を生成する方法とその応用例について解説しました。

乱数生成の基本的な計算式や、サイコロのシミュレーション、カードゲームのシャッフル、ランダムな配列の生成といった具体的な応用例を通じて、乱数の活用方法を学びました。

これを機に、乱数を活用したプログラムを作成し、実際に試してみてください。

  • URLをコピーしました!
目次から探す