函数
<cstdlib>

rand

int rand (void);
生成随机数
返回一个在 0RAND_MAX 之间的伪随机整数。

这个数字是由一个算法生成的,每次调用该算法都会返回一个看似不相关的数字序列。该算法使用一个种子来生成序列,应使用 srand 函数将种子初始化为某个独特的值。

RAND_MAX 是一个在 <cstdlib> 中定义的常量。

一个使用 rand 在确定范围内生成简单伪随机数的典型方法是,将返回值对范围跨度取模,然后加上范围的初始值。

1
2
3
v1 = rand() % 100;         // v1 in the range 0 to 99
v2 = rand() % 100 + 1;     // v2 in the range 1 to 100
v3 = rand() % 30 + 1985;   // v3 in the range 1985-2014 

但请注意,此取模操作并不会在范围内生成均匀分布的随机数(因为在大多数情况下,此操作会使较小的数字出现的可能性略高)。

C++ 支持各种强大的工具来生成随机和伪随机数(更多信息请参见 <random>)。

参数

(无)

返回值

一个介于 0 和 RAND_MAX 之间的整数值。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/* rand example: guess the number */
#include <stdio.h>      /* printf, scanf, puts, NULL */
#include <stdlib.h>     /* srand, rand */
#include <time.h>       /* time */

int main ()
{
  int iSecret, iGuess;

  /* initialize random seed: */
  srand (time(NULL));

  /* generate secret number between 1 and 10: */
  iSecret = rand() % 10 + 1;

  do {
    printf ("Guess the number (1 to 10): ");
    scanf ("%d",&iGuess);
    if (iSecret<iGuess) puts ("The secret number is lower");
    else if (iSecret>iGuess) puts ("The secret number is higher");
  } while (iSecret!=iGuess);

  puts ("Congratulations!");
  return 0;
}

在此示例中,随机种子被初始化为表示当前时间的值(通过调用 time),以确保每次程序运行时都能生成不同的值。

可能的输出

Guess the number (1 to 10): 5
The secret number is higher
Guess the number (1 to 10): 8
The secret number is lower
Guess the number (1 to 10): 7
Congratulations!


兼容性

在 C 语言中,可以保证 rand 使用的生成算法仅通过调用此函数来推进。在 C++ 中,此限制被放宽了,库实现允许在其他情况下推进生成器(例如调用 <random> 的元素时)。

数据竞争

该函数会访问和修改内部状态对象,这可能会与并发调用 randsrand 产生数据竞争。

一些库提供了一个可替代的函数,它明确地避免了这种数据竞争:rand_r(不可移植)。

C++ 库的实现允许保证调用此函数时不会发生数据竞争

异常 (C++)

无异常保证:此函数从不抛出异常。

另见