Namespaces
Variants

std:: rand

From cppreference.net
ヘッダーで定義 <cstdlib>
int rand ( ) ;

範囲 [ 0 , RAND_MAX ] から疑似乱数の整数値を返します。

std::srand() rand() で使用される擬似乱数生成器を初期化します。 もし rand() std::srand() の呼び出しより前に使用された場合、 rand() std:: srand ( 1 ) で初期化されたかのように動作します。

rand() std::srand() でシードされるたびに、連続する呼び出しで同じ値のシーケンスを生成しなければなりません。

標準ライブラリ内の他の関数は rand を呼び出す可能性があります。どの関数がこれを行うかは実装定義です。

rand() がスレッドセーフであるかどうかは実装定義です。

目次

戻り値

0 RAND_MAX の間の疑似乱数整数値。

注記

生成される乱数列の品質について保証はありません。 過去には、一部の rand() 実装において、生成される数列の乱数性、分布、周期に重大な欠陥がありました(有名な例では、下位ビットが呼び出しごとに単に 1 0 を交互に繰り返す場合がありました)。

rand() は、本格的な乱数生成のニーズには推奨されません。 C++11の 乱数生成機能 を使用して rand() を置き換えることが推奨されます。 (C++11以降)

以下の関数 bounded_rand() は、 Debiased Modulo (Once) を修正したバージョンです。

#include <cstdlib>
#include <ctime>
#include <initializer_list>
#include <iostream>
unsigned bounded_rand(unsigned range)
{
    for (unsigned x, r;;)
        if (x = rand(), r = x % range, x - r <= -range)
            return r;
}
int main() 
{
    std::srand(std::time({})); // use current time as seed for random generator
    const int random_value = std::rand();
    std::cout << "Random value on [0, " << RAND_MAX << "]: " << random_value << '\n';
    for (const unsigned sides : {2, 4, 6, 8})
    {
        std::cout << "Roll " << sides << "-sided die 8 times: ";
        for (int n = 8; n; --n)
            std::cout << 1 + bounded_rand(sides) << ' ';
        std::cout << '\n';
    }
}

出力例:

Random value on [0, 2147483647]: 948298199
Roll 2-sided die 8 times: 2 2 1 2 1 1 2 2 
Roll 4-sided die 8 times: 1 3 4 2 1 3 3 1 
Roll 6-sided die 8 times: 3 2 1 6 6 4 4 2 
Roll 8-sided die 8 times: 4 5 6 6 3 6 1 2

関連項目

範囲内で均一に分布する整数値を生成する
(クラステンプレート)
擬似乱数生成器をシードする
(関数)
std::rand によって生成可能な最大値
(マクロ定数)
指定された範囲内の乱数整数を生成する
(関数テンプレート)