【C言語入門】乱数(rand)の使い方

乱数って使ってますか?ある範囲の数値の中から偏りなく無作為に数値を選んで使いたい場合に乱数を使用します。自動で繰り返し処理を行いたい場合などに使う数値として乱数はよく使われます。

例えばパスワードなどでは乱数を使って無作為に英文字や数値を選んで並べたものが使われています。

この記事では、乱数について

  • 乱数とは
  • randの使い方
  • randを使ったサンプルコード

など基本的な内容から、具体的な使い方の内容についても解説していきます。今回は乱数について、使い方をわかりやすく解説します!

乱数とは

乱数とは一意的ではなくランダムで何が出るかわからない数字のことです。C言語ではrand関数を使ってよく疑似乱数を生成させます。

プログラミングで生成する乱数の羅列はそれぞれの値はランダムで生成されますが、同じ羅列を再現して出すことができるので何が出るか先読みすることができます。したがって本当の意味での乱数ではないので、区別して疑似乱数と呼んでいます。

randの使い方

rand関数を使って乱数を発生させる方法についてみていきましょう。

基本的な使い方

rand関数を使うためにはヘッダーファイル「stdlib.h」をインクルードする必要があります。rand関数を使うと0~RAND_MAXまでの整数の乱数を生成することができます。RAND_MAXはヘッダーファイル「stdlib.h」で定義されています。

RAND_MAXの値は環境により異なりますので注意しましょう。この解説では下記のように定義されている環境で確認しています。

#define RAND_MAX 0x7fffffff

0x7fffffffは十進数で表すと2147483647となります。

したがって0~2147483647までの乱数を発生させることになります。rand関数は引数は指定しません。

それではサンプルコードで使い方をみていきましょう。

実行結果:

このサンプルコードでは3回繰り返して乱数を発生させています。乱数を発生させていますので、環境を変えて実行した結果はこの結果とは異なる表示になります。

この環境ではrand関数は0から2147483647までの乱数を生成しますので、例えば1~10までの乱数を生成したい場合は10の剰余に1加えて1~10の数値を算出します。なお、このサンプルコードでは繰り返し実行しても同じ結果が繰り返し出力表示されますので注意しましょう。実行するたびに違う結果を出力表示したい場合はrand関数を使う前に初期化を行う必要があります。

初期化の方法について詳しくみていきましょう!

初期化の方法

初期化を行うにはsrand関数を使用します。

srand関数の引数には符号なし整数を使用します。符号なし整数に同じ値を使うと乱数は同じ値で初期化されます。乱数の初期値を毎回変えたい場合は、一般にtime関数を使って現在の時刻を取得して利用します。

time関数は現在の歴時刻を秒単位で取得します。ちなみに歴時刻とはグリニッジ標準時の1970年1月1日0時から現在までの経過時間を秒単位で表したものです。time関数を使うためにはヘッダーファイル「time.h」をインクルードする必要があります。time関数の引数にNULLを指定して使用します。

それではサンプルコードで確認していきましょう。

実行結果:

このサンプルコードでは、srand関数を使ってrand関数を初期化しています。まずsrand関数の引数に1を指定して初期化しrand関数で乱数を発生させた場合は、3回とも同じ乱数が生成されています。次にsrand関数の引数にtime関数を使って初期化しrand関数で乱数を発生させた場合は、3回とも違う値の乱数が生成されています。

なお、time関数は秒単位で歴時刻を取得しますので繰り返し処理が1秒以内で終了する場合は同じ歴時刻を取得します。

そうすると同じ値で初期化することになりますので、このサンプルコードではsleep関数を使って1秒待機させ違う歴時刻を取得するようにしています。sleep関数を使うにはヘッダーファイル「unistd.h」をインクルードする必要があります。

randを使ったサンプルコード

rand関数を使って乱数を生成するサンプルコードとして、サイコロの出目を表示する例とじゃんけんの勝ち負けを表示する例をご紹介します。

サイコロ

このサンプルコードではrand関数を使って1~6までの乱数を生成し出力表示しています。

srand関数を使って現在の歴時刻で初期化していますので、実行するたびに出力表示は変わります。

実行結果:

じゃんけん

このサンプルコードではrand関数を使って0~2までの乱数を生成しています。0の場合はグー、1の場合はチョキ、2の場合はパーとしてじゃんけんの勝ち負けの出力表示処理をしています。

こちらもsrand関数を使って現在の歴時刻で初期化していますので、実行するたびに出力表示は変わります。

実行結果:

まとめ

ここでは、乱数の生成について説明しました。

rand関数を使って乱数を生成する場合、実行するたびに同じ値の乱数を生成させるか、毎回繰り返し同じ値で初期化して同じ値の乱数を生成させるか、毎回違う値で初期化して違う値の乱数を生成させるか目的にあわせて乱数の生成方法を選ぶ必要があります。

目的にあわせて使い分けることができるように、この記事を何度も参考にして下さいね!

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

長野 透

長野 透

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
[email protected]

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説