
C言語入門|randとsrandによる乱数生成:C言語でランダム値を作る基本
ここでは、
C言語で「ランダムな数(乱数)」を作る方法
を学んでいきます🎲✨
ゲーム、占い、じゃんけん、ガチャ、敵の行動パターン…
どれも「毎回違う結果」が出ないと面白くないですよね😊
その正体が、今回の主役である rand と srand です!
乱数ってなに?🤔
乱数とは、
👉 実行するまで何が出るかわからない数値
のことです。
コンピュータは本来とても几帳面なので、そのままでは毎回同じ結果を出してしまいます。
そこで「サイコロみたいな仕組み」を用意してあげる必要があるんですね🎲
randで乱数を作る😊
まずは、乱数を取り出す命令から見てみましょう。
int r = rand() % ➀;| 項目 | 内容 |
|---|---|
| rand() | 乱数を1つ取り出す命令 |
| % ① | 乱数の範囲を調整する |
| ① | 1以上の整数(上限値、含まれない) |
| 必要なヘッダ | stdlib.h |
この書き方では、
- 0 以上
- ① 未満
の整数がランダムに生成されます✨
たとえば👇
| 指定 | 実際に出る値 |
|---|---|
| rand() % 10 | 0 ~ 9 |
| rand() % 100 | 0 ~ 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言語学習の中でも、
特にワクワクするポイントですよ✨
ここまで理解できれば、
「決まった処理」から「毎回違う処理」へ
大きくレベルアップです🚀
この乱数を 条件分岐や繰り返し と組み合わせると、
さらに本格的なプログラムが作れるようになりますよ😊
