rand
From cppreference.com
| ヘッダー <stdlib.h> で定義 |
||
| int rand(); |
||
0 から RAND_MAX までの疑似乱数整数値を返します(0 と RAND_MAX を含む)。
srand() は、rand() が使用する疑似乱数生成器にシードを設定します。rand() を srand() の呼び出し前に使用した場合、rand() は srand(1) でシードが設定されたかのように動作します。srand() で rand() がシードされるたびに、同じ値のシーケンスを生成する必要があります。
rand() はスレッドセーフであることが保証されていません。
目次 |
[編集] パラメータ
(なし)
[編集] 戻り値
0 から RAND_MAX までの疑似乱数整数値(両端を含む)。
[編集] 注
生成される乱数列の品質について、保証はありません。過去には、rand() の実装において、生成されるシーケンスのランダム性、分布、周期に深刻な欠陥があった例があります(よく知られている例では、下位ビットが呼び出し間で単に 1 と 0 を交互に繰り返すだけでした)。rand() は、暗号化のような、真剣な乱数生成のニーズには推奨されません。
POSIX では、rand が使用する疑似乱数生成器の周期は少なくとも 232
であることが要求されています。
POSIX は、`rand_r` というスレッドセーフ版の rand を提供していましたが、これは drand48 ファミリの関数に取って代わられ、廃止されました。
[編集] 例
このコードを実行
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { srand(time(NULL)); // use current time as seed for random generator int random_variable = rand(); printf("Random value on [0,%d]: %d\n", RAND_MAX, random_variable); // roll a 6-sided die 20 times for (int n=0; n != 20; ++n) { int x = 7; while(x > 6) x = 1 + rand()/((RAND_MAX + 1u)/6); // Note: 1+rand()%6 is biased printf("%d ", x); } }
実行結果の例
Random value on [0,2147483647]: 448749574 3 1 3 1 4 2 2 1 3 6 4 4 3 1 6 2 3 2 6 1
[編集] 参考文献
- C17標準 (ISO/IEC 9899:2018)
- 7.22.2.1 The rand function (p: 252)
- C11標準 (ISO/IEC 9899:2011)
- 7.22.2.1 The rand function (p: 346)
- C99標準 (ISO/IEC 9899:1999)
- 7.20.2.1 The rand function (p: 312)
- C89/C90標準 (ISO/IEC 9899:1990)
- 4.10.2.1 The rand function
[編集] 関連項目
| 擬似乱数生成器にシードを設定する (関数) | |
| rand() で生成可能な最大値 (マクロ定数) | |
| C++ ドキュメント for rand
| |