C++で乱数を生成する方法:rand関数とsrand関数の使い方を解説
C++では、標準ライブラリに含まれる rand() 関数を使うことで、簡単に乱数を生成できます。また、srand() 関数は、rand() が内部で利用する乱数生成器の「シード(種)」を設定する役割を持っています。
ここでは、rand() と srand() を使用した具体的なプログラム例を紹介します。
プログラム例1:固定シード値を使う場合
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main() {
srand(1);
for(int i=0; i<5; i++)
cout << rand() % 100 << " ";
return 0;
}
実行結果
83 86 77 15 93
このプログラムでは、srand(1) によってシード値が常に「1」に固定されているため、プログラムを実行するたびに必ず同じ乱数列が出力されます。これは、擬似乱数生成器が同じシードからは常に同じ数列を再現するという性質によるものです。
プログラム例2:実行ごとに異なる乱数を得る場合
毎回異なる乱数列を生成したい場合は、現在時刻をシードとして渡す srand(time(NULL)) を使います。時刻は常に変化しているため、実行のたびに異なるシードが設定され、結果も変わります。
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main() {
srand(time(NULL));
for(int i=0; i<5; i++)
cout << rand() % 100 << " ";
return 0;
}
実行結果
63 98 17 49 46
同じプログラムをもう一度実行すると、今度は次のように異なる結果が得られます。
44 21 19 2 83
ポイントまとめ
rand():0 から RAND_MAX までの範囲の擬似乱数を返す関数。% 100を付けることで 0〜99 の整数に限定できる。srand():乱数生成器の初期化(シード設定)を行う関数。呼び出さない場合はデフォルトのシードが使われる。- デバッグやテストで再現性が必要なときは固定シード(例:
srand(1))を、実際のアプリケーションで多様な乱数が必要なときはsrand(time(NULL))を使うのが一般的。
-
C++で対角行列・スカラー行列を判定するプログラムの書き方
行列 M[r][c] が与えられたとき、「r」は行数、「c」は列数を表し、r = c のとき正方行列となります。本記事では、与えられた正方行列が対角行列であるか、スカラー行列であるかを判定し、該当する場合には「yes」を出力する方法を解説します。 対角行列とは 正方行列 m[][] が対角行列であるのは、主対角線以外の要素がすべてゼロである場合、かつその場合に限ります。 下図のように、赤色で示された要素が主対角成分(非ゼロ)であり、それ以外の要素はすべてゼロになっているため、この行列は対角行列です。 入出力例 Input: m[3][3] = { {7, 0, 0}, {0, 8, 0}
-
C++のceil関数とfloor関数の使い方をわかりやすく解説
ceil関数とは ceil関数は、引数に渡した値以上となる整数のうち、最も小さい値(切り上げた値)を返す関数です。C++では「cmath」ヘッダーファイル内で宣言されており、引数には天井値を求めたい単一の値を指定します。なお、引数のデータ型はdouble型・float型・long double型のいずれかである必要があります。 C++におけるceil関数の構文は以下のとおりです。 double ceil(double x); float ceil(float x); それでは、ceil関数を使用した具体的なサンプルコードを見ていきましょう。 サンプルコード #include <iost