std::rand
来自cppreference.com
在标头 <cstdlib> 定义
|
||
int rand(); |
||
返回来自范围 [
0,
RAND_MAX]
的伪随机整数值。
std::srand() 播种 rand()
所用的伪随机数生成器。
若在任何对 std::srand() 的调用前使用了 rand()
,则 rand()
表现如同它以 srand(1)
播种。
每次以 std::srand() 播种 rand()
,它必定在后续调用上产生相同的值数列。
标准库中的其他函数可调用 rand
。哪个函数这么做是实现定义的。
rand()
是否线程安全是实现定义的。
参数
(无)
返回值
0 与 RAND_MAX 间的随机整数值。
注解
不保证生成的随机数列质量。
过去,一些 rand()
在随机性、分布和产生的序列周期上有严重缺陷(在一个众所周知的例子中,调用之间最低位简单地在 1 与 0 间切换)。
对于严肃的随机数生成需求不推荐使用 rand()
。推荐用 C++11 的随机数生成设施替换 rand()
。 (C++11 起)
示例
运行此代码
#include <cstdlib> #include <ctime> #include <iostream> int main() { std::srand(std::time(nullptr)); // 以当前时间为随机生成器的种子 int random_value = std::rand(); std::cout << "[0, " << RAND_MAX << "] 上的随机值: " << random_value << '\n'; for (const int times = 8; const int sides : {2, 4, 6, 8}) { std::cout << "扔 " << sides << " 面骰子 " << times << " 次: "; for (int n = 0; n != times; ++n) { int x = sides + 1; while (x > sides) x = 1 + std::rand() / ((RAND_MAX + 1u) / sides); // 注意:1 + rand() % sides 有偏差! std::cout << x << ' '; } std::cout << '\n'; } }
可能的输出:
[0, 2147483647] 上的随机值: 948298199 扔 2 面骰子 8 次: 2 2 1 2 1 1 2 2 扔 4 面骰子 8 次: 1 3 4 2 1 3 3 1 扔 6 面骰子 8 次: 3 2 1 6 6 4 4 2 扔 8 面骰子 8 次: 4 5 6 6 3 6 1 2
参阅
(C++11) |
产生在一个范围上均匀分布的整数值 (类模板) |
初始化伪随机数生成器 (函数) | |
std::rand 生成的最大可能值 (宏常量) | |
生成指定范围中的随机整数 (函数模板) |