C言語入門|randとsrandによる乱数生成:C言語でランダム値を作る基本

ここでは、
C言語で「ランダムな数(乱数)」を作る方法
を学んでいきます🎲✨

ゲーム、占い、じゃんけん、ガチャ、敵の行動パターン…
どれも「毎回違う結果」が出ないと面白くないですよね😊

その正体が、今回の主役である randsrand です!

乱数ってなに?🤔

乱数とは、
👉 実行するまで何が出るかわからない数値
のことです。

コンピュータは本来とても几帳面なので、そのままでは毎回同じ結果を出してしまいます。
そこで「サイコロみたいな仕組み」を用意してあげる必要があるんですね🎲

randで乱数を作る😊

まずは、乱数を取り出す命令から見てみましょう。

int r = rand() % ➀;
項目内容
rand()乱数を1つ取り出す命令
% ①乱数の範囲を調整する
1以上の整数(上限値、含まれない)
必要なヘッダstdlib.h

この書き方では、

  • 0 以上
  • ① 未満

の整数がランダムに生成されます✨

たとえば👇

指定実際に出る値
rand() % 100 ~ 9
rand() % 1000 ~ 99

randを使ったサンプルプログラム🧪

少しアレンジした例を見てみましょう。

プロジェクト名:3-12-1 ソースファイル名: sample3-12-1.c

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

int main(void)
{
    int r = rand() % 50;
    printf("今日のラッキーナンバーは %d です!\n", r);
    return 0;
}

これで、0~49 のどれかが表示されます😊

…が!

「毎回同じ数字が出る」問題😱

ここで、多くの人がこう思います。

あれ?
何回実行しても、同じ数字しか出ないんだけど…?

実はこれ、バグではありません😮

rand は、
👉 最初の準備をしないと、毎回同じ順番で乱数を出す
という性質を持っているんです。

つまり、
シャッフルされていないトランプを、毎回同じ順で配っている状態
なんですね🃏

srandは「乱数の準備係」✨

そこで登場するのが srand です😊

srand は、
👉 乱数のスタート地点をランダムに決める命令
です。

書き方はこちら👇

srand((unsigned)time(nullptr));
項目役割
srand乱数生成の初期化
time現在時刻を取得
unsigned符号なし整数に変換
nullptr / NULL現在時刻を取得するための指定

※ この1行は randを使う前に1回だけ 実行すればOKです🙂

なぜ time を使うの?⏰

いい質問です😊

time は、
👉 実行した瞬間の時刻(秒単位)
を返します。

つまり、

  • 朝に実行
  • 夜に実行
  • 1秒後に実行

これだけで値が変わるため、
毎回違うスタート地点から乱数が始まる
というわけです✨

「完全な乱数」ではありませんが、
入門やゲーム用途には十分なランダム性があります🎮

srandとrandを組み合わせた完成形🧪

準備を入れた正しい例がこちらです。

プロジェクト名:3-12-2 ソースファイル名: sample3-12-2.c

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

int main(void)
{
    srand((unsigned)time(nullptr));
    int r = rand() % 100;
    printf("あなたはたぶん、%d歳ですね?\n", r);
    return 0;
}

このプログラムでは、

1️⃣ 現在時刻を使って乱数の準備
2️⃣ 0~99 の乱数を生成
3️⃣ 結果を画面に表示

という流れになっています😊

👉 実行するたびに結果が変わる!
これぞ乱数ですね🎉

randとsrandの役割まとめ✨

命令役割
rand乱数を1つ取り出す。
srand乱数の出方をシャッフルする準備
time毎回違う値を作る材料

ポイントはただ1つ☝️

srandは最初に1回、randは必要なだけ使う!

乱数でできることが一気に広がる🎮

乱数が使えるようになると、

  • ゲームの敵行動
  • ガチャ・くじ
  • 占い・運試し
  • ランダムイベント

など、
「プログラムっぽさ」が一気に増します😆

ここはC言語学習の中でも、
特にワクワクするポイントですよ✨

ここまで理解できれば、
「決まった処理」から「毎回違う処理」へ
大きくレベルアップです🚀

この乱数を 条件分岐や繰り返し と組み合わせると、
さらに本格的なプログラムが作れるようになりますよ😊