C++
 Computer >> コンピューター >  >> プログラミング >> C++

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)) を使うのが一般的。
  1. C++で対角行列・スカラー行列を判定するプログラムの書き方

    行列 M[r][c] が与えられたとき、「r」は行数、「c」は列数を表し、r = c のとき正方行列となります。本記事では、与えられた正方行列が対角行列であるか、スカラー行列であるかを判定し、該当する場合には「yes」を出力する方法を解説します。 対角行列とは 正方行列 m[][] が対角行列であるのは、主対角線以外の要素がすべてゼロである場合、かつその場合に限ります。 下図のように、赤色で示された要素が主対角成分(非ゼロ)であり、それ以外の要素はすべてゼロになっているため、この行列は対角行列です。 入出力例 Input: m[3][3] = { {7, 0, 0}, {0, 8, 0}

  2. C++のceil関数とfloor関数の使い方をわかりやすく解説

    ceil関数とは ceil関数は、引数に渡した値以上となる整数のうち、最も小さい値(切り上げた値)を返す関数です。C++では「cmath」ヘッダーファイル内で宣言されており、引数には天井値を求めたい単一の値を指定します。なお、引数のデータ型はdouble型・float型・long double型のいずれかである必要があります。 C++におけるceil関数の構文は以下のとおりです。 double ceil(double x); float ceil(float x); それでは、ceil関数を使用した具体的なサンプルコードを見ていきましょう。 サンプルコード #include <iost