rand
|
ヘッダーで定義
<stdlib.h>
|
||
|
int
rand
(
)
;
|
||
0
から
RAND_MAX
までの範囲(
0
および
RAND_MAX
を含む)の疑似乱数整数値を返します。
srand()
rand()
で使用される擬似乱数生成器にシード値を設定します。
rand()
が
srand()
の呼び出しより前に使用された場合、
rand()
は
srand
(
1
)
でシードされたかのように動作します。
rand()
が
srand()
で同じシード値で初期化されるたびに、同じ値のシーケンスを生成しなければなりません。
rand()
はスレッドセーフであることが保証されていません。
目次 |
パラメータ
(なし)
戻り値
0 から RAND_MAX までの範囲(両端を含む)の疑似乱数整数値。
注記
生成される乱数列の品質について保証はありません。
過去には、一部の
rand()
実装において、生成される数列の乱数性、分布、周期に重大な欠陥がありました(有名な例では、下位ビットが呼び出しごとに単に
1
と
0
を交互に繰り返すものでした)。
rand()
は、暗号などの本格的な乱数生成が必要な用途には推奨されません。
POSIXでは、
rand
が使用する疑似乱数生成器の周期が少なくとも
2
32
であることを要求しています。
POSIXはスレッドセーフ版のrandとして
rand_r
を提供していましたが、これは
drand48
ファミリーの関数を優先するため廃止されました。
例
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { srand(time(NULL)); // 乱数生成器のシードとして現在時刻を使用 int random_variable = rand(); printf("Random value on [0,%d]: %d\n", RAND_MAX, random_variable); // 6面ダイスを20回振る for (int n=0; n != 20; ++n) { int x = 7; while(x > 6) x = 1 + rand()/((RAND_MAX + 1u)/6); // 注意: 1+rand()%6 は偏りがある 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 rand関数 (p: 252)
- C11規格 (ISO/IEC 9899:2011):
-
- 7.22.2.1 rand関数 (p: 346)
- C99規格 (ISO/IEC 9899:1999):
-
- 7.20.2.1 rand関数 (p: 312)
- C89/C90標準 (ISO/IEC 9899:1990):
-
- 4.10.2.1 rand関数
関連項目
|
擬似乱数生成器をシードする
(関数) |
|
|
rand
(
)
によって生成可能な最大値
(マクロ定数) |
|
|
C++ documentation
for
rand
|
|