rand
|
定义于头文件
<stdlib.h>
|
||
|
int
rand
(
)
;
|
||
返回一个介于
0
和
RAND_MAX
之间的伪随机整数值(包含
0
和
RAND_MAX
)。
srand()
为
rand()
所使用的伪随机数生成器提供种子。
如果在调用
srand()
之前使用了
rand()
,则
rand()
的行为会如同以
srand
(
1
)
进行过播种。
每次使用
srand()
为
rand()
设置相同种子时,必须生成相同的数值序列。
rand()
不保证是线程安全的。
目录 |
参数
(无)
返回值
介于 0 与 RAND_MAX 之间(含边界值)的伪随机整数值。
注释
无法保证所生成随机序列的质量。
过去,某些
rand()
实现存在随机性、分布性和序列周期性的严重缺陷(在一个著名案例中,连续调用时最低位仅在
1
和
0
之间交替)。
对于需要高质量随机数的场景(如密码学),不建议使用
rand()
。
POSIX 要求
rand
函数使用的伪随机数生成器周期至少为
2
32
。
POSIX 提供了线程安全的随机数生成器版本
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函数(第312页)
- C89/C90 标准 (ISO/IEC 9899:1990):
-
- 4.10.2.1 rand 函数
参考
|
初始化伪随机数生成器
(函数) |
|
|
rand
(
)
可生成的最大值
(宏常量) |
|
|
C++ 文档
中关于
rand
的内容
|
|