名前空間
変種
操作

std::rand

From cppreference.com
< cpp‎ | numeric‎ | random
 
 
 
 
ヘッダ <cstdlib> で定義
int rand();

範囲[0RAND_MAX]内の擬似乱数整数値を返します。

std::srand()は、rand()で使用される擬似乱数ジェネレータのシードを設定します。 rand()std::srand()への呼び出しなしに使用される場合、rand()std::srand(1)でシードされたかのように動作します。

std::srand()rand()がシードされるたびに、 successive callsで同じ値のシーケンスを生成する必要があります。

標準ライブラリの他の関数がrandを呼び出す場合があります。どの関数がそうするかは実装定義です。

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

目次

[編集] 戻り値

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

[編集] 注記

生成される乱数列の品質については保証はありません。過去には、rand()の実装の中には、生成されるシーケンスのランダム性、分布、周期に深刻な欠点があるものがありました(よく知られた例では、低位ビットが呼び出し間で単に10の間で交互に変化しました)。

rand()は、真剣な乱数生成のニーズには推奨されません。rand()を置き換えるためにC++11の乱数生成機能を使用することが推奨されます。(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によって生成される可能性のある最大値
(マクロ定数) [編集]
指定された範囲のランダムな整数を生成する
(関数テンプレート) [編集]
Cドキュメントrand用)
English 日本語 中文(简体) 中文(繁體)