初心者向け・C言語 乱数の生成方法|rand関数・srand関数の使い方と実践例

c言語 乱数 2025

プログラミングでランダムな値を扱いたいときに欠かせないのが、C言語 乱数の仕組みです。ゲームの敵の出現位置、シミュレーションデータの生成、テスト用データの作成など、乱数はさまざまな場面で使われています。この記事では、C言語 乱数の基本とrand関数の使い方を中心に、初心者にもわかりやすく解説します。

C言語で乱数を扱う基本を理解しよう

乱数とは?

乱数とは、予測できない値・擬似的なランダム値のことです。C言語では「ある規則に基づいてランダムっぽく見える数」を生成します。

乱数が使われる代表的なシーン

  • ゲーム開発・敵の動きやアイテム出現位置をランダムに決める
  • シミュレーション・確率に基づいた結果を再現する
  • テストデータ生成・入力のバリエーションを増やす

このように、C言語 乱数は実践的なプログラミングに欠かせない重要な機能です。

rand関数で乱数を生成する方法

最も基本的な方法はrand関数を使用することです。C言語で乱数を生成する方法でも詳しく解説されています。

基本構文と使い方

#include <stdlib.h>
int main(void) {
int num = rand();
printf("%dn", num);
return 0;
}

生成される値の範囲

rand()が返す値は 0 ~ RAND_MAX の範囲です。RAND_MAXは多くの環境で32767です。

任意の範囲で乱数を生成する

int num = rand() % 6 + 1; // 1~6 の乱数

サイコロの出目のように1~6までの整数をランダムに生成できます。

srand関数で乱数を初期化する理由と方法

なぜ乱数 初期化が必要なのか?

rand()だけを使うと毎回同じ順番の乱数が生成されます。これはC言語の乱数が擬似乱数だからです。そこで初期化用の関数srand()を使います。

使い方の例

#include <stdlib.h>
#include <time.h>
int main(void) {
srand((unsigned int)time(NULL)); // 現在時刻をシードに設定
int num = rand() % 6 + 1;
printf("%dn", num);
return 0;
}

上記のように、現在時刻で初期化すると実行のたびに異なる結果が得られます。

randとsrandを組み合わせた実践コード例

サイコロを振るプログラム

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
srand((unsigned int)time(NULL));
int dice = rand() % 6 + 1;
printf("サイコロの目: %dn", dice);
return 0;
}

じゃんけんプログラム

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
srand((unsigned int)time(NULL));
int hand = rand() % 3; // 0=グー, 1=チョキ, 2=パー
printf("あなたの手は: %dn", hand);
return 0;
}

乱数範囲を自在に設定するテクニック

int random = rand() % (max - min + 1) + min;

例:10~50の範囲の乱数

int num = rand() % (50 - 10 + 1) + 10;

より詳細な範囲設定方法やrand関数の注意点は、C言語 randの基本と注意点で解説されています。

乱数生成の注意点とよくある落とし穴

  • srandを複数回初期化すると偏る: 初期化は1回のみ行う
  • RAND_MAXを超える値は生成できない: 大きな乱数は別の関数を検討
  • 高精度な乱数が必要な場合: メルセンヌ・ツイスタなどのアルゴリズムを使用

まとめ|randとsrandを理解してC言語の乱数を自在に使おう

  • rand()で乱数を生成し、srand()で初期化
  • 初期化を適切に行うと実行ごとに異なる結果が得られる
  • 範囲指定で任意の乱数を作れる

C言語 乱数を理解することで、ゲーム・シミュレーション・データ処理など、幅広いプログラミングに応用できます。

読む  【初心者向け】チャットGPT 無料版の使い方と有料版との違い|GPT-4との比較でわかる最適な選び方
タイトルとURLをコピーしました