std::rand

来自cppreference.com
< cpp‎ | numeric‎ | random
 
 
 
 
在标头 <cstdlib> 定义
int rand();

返回来自范围 [0RAND_MAX] 的伪随机整数值。

std::srand() 播种 rand() 所用的伪随机数生成器。 若在任何对 std::srand() 的调用前使用了 rand(),则 rand() 表现如同它以 srand(1) 播种。

每次以 std::srand() 播种 rand(),它必定在后续调用上产生相同的值数列。

标准库中的其他函数可调用 rand。哪个函数这么做是实现定义的。

rand() 是否线程安全是实现定义的。

参数

(无)

返回值

0RAND_MAX 间的随机整数值。

注解

不保证生成的随机数列质量。 过去,一些 rand() 在随机性、分布和产生的序列周期上有严重缺陷(在一个众所周知的例子中,调用之间最低位简单地在 10 间切换)。

对于严肃的随机数生成需求不推荐使用 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

参阅

产生在一个范围上均匀分布的整数值
(类模板)
初始化伪随机数生成器
(函数)
std::rand 生成的最大可能值
(宏常量)
生成指定范围中的随机整数
(函数模板)