[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
このプログラムでは、負の数を含む範囲で乱数を生成しています。
min
と max
の値を調整することで、任意の範囲の乱数を生成することが可能です。
応用例
乱数生成は、さまざまなプログラムで応用されています。
ここでは、乱数を利用した具体的な応用例をいくつか紹介します。
サイコロのシミュレーション
サイコロを振るシミュレーションは、乱数生成の典型的な応用例です。
サイコロは通常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個の要素を持つ配列を生成します。
ランダムな配列は、さまざまな用途で利用可能です。
よくある質問
まとめ
この記事では、C言語で指定した範囲の乱数を生成する方法とその応用例について解説しました。
乱数生成の基本的な計算式や、サイコロのシミュレーション、カードゲームのシャッフル、ランダムな配列の生成といった具体的な応用例を通じて、乱数の活用方法を学びました。
これを機に、乱数を活用したプログラムを作成し、実際に試してみてください。