std::rand
From cppreference.com
| ヘッダ <cstdlib> で定義 |
||
| int rand(); |
||
範囲[0, RAND_MAX]内の擬似乱数整数値を返します。
std::srand()は、rand()で使用される擬似乱数ジェネレータのシードを設定します。 rand()がstd::srand()への呼び出しなしに使用される場合、rand()はstd::srand(1)でシードされたかのように動作します。
std::srand()でrand()がシードされるたびに、 successive callsで同じ値のシーケンスを生成する必要があります。
標準ライブラリの他の関数がrandを呼び出す場合があります。どの関数がそうするかは実装定義です。
rand()がスレッドセーフかどうかは実装定義です。
目次 |
[編集] 戻り値
0とRAND_MAXの間の擬似乱数整数値。
[編集] 注記
生成される乱数列の品質については保証はありません。過去には、rand()の実装の中には、生成されるシーケンスのランダム性、分布、周期に深刻な欠点があるものがありました(よく知られた例では、低位ビットが呼び出し間で単に1と0の間で交互に変化しました)。
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
[編集] 関連情報
| (C++11) |
範囲内で一様に分布する整数値を生成する (クラステンプレート) |
| 擬似乱数生成器にシードを設定する (関数) | |
| std::randによって生成される可能性のある最大値 (マクロ定数) | |
| 指定された範囲のランダムな整数を生成する (関数テンプレート) | |
| Cドキュメント(
rand用) | |