Namespaces
Variants

rand

From cppreference.net
定义于头文件 <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 的内容