函式
<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++)

無異常保證:此函式從不丟擲異常。

另見