C++中的随机数生成是编程中常见的需求,特别是在模拟、游戏开发、数据分析等领域。C++标准库提供了一个名为`rand()`的函数,用于生成0到`RAND_MAX`之间的随机整数。`RAND_MAX`是一个预定义的常量,其值至少为32767,这取决于具体的实现。`rand()`函数生成的是伪随机数,即每次程序执行时,如果不改变随机数种子,它会返回相同的序列。
为了生成特定范围内的随机数,可以使用求模运算符 `%`。例如,若要生成0或1,可以使用`rand() % 2`;若要生成1到6之间的随机数,可以使用`rand() % 6 + 1`。这里,`%`后的数字被称为比例因子,而`+1`是为了确保结果包含范围的起始值。
以下是一些示例代码片段:
```cpp
#include <iostream>
#include <cstdlib>
int main() {
for (int i = 1; i <= 20; i++) {
std::cout << (1 + rand() % 6) << '\t';
if (i % 5 == 0)
std::cout << std::endl;
}
return 0;
}
```
这段代码会打印出20个1到6之间的随机整数,每5个数换一行。
然而,`rand()`函数生成的伪随机数序列是可预测的,这意味着如果你不改变随机种子,每次运行程序都会得到相同的结果。为了生成不同的随机数序列,可以使用`srand()`函数来设置随机种子。`srand(unsigned int seed)`函数接受一个无符号整数作为种子,这样每次程序运行时,只要种子不同,生成的随机数序列也会不同。
例如:
```cpp
#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
srand(time(0)); // 使用当前时间作为随机种子
for (int i = 1; i <= 10; i++) {
std::cout << (1 + rand() % 6) << '\t';
if (i % 5 == 0)
std::cout << std::endl;
}
return 0;
}
```
在这里,`time(0)`返回当前时间的秒数,将其作为种子传递给`srand()`,确保每次运行时都有不同的随机数序列。
另外,还有一种情况,如果你不想每次都手动输入种子,可以使用`time(0)`或者`time(NULL)`,它们都表示当前的“日历时间”秒数,这样可以避免重复的随机数序列。
在更复杂的场景中,如生成三位整数并进行排序,可以结合`rand()`和排序算法。例如,使用选择排序对数组进行排序,并计算排序所需的时间:
```cpp
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <conio.h>
void select_sort(int array[], int n) {
// 实现选择排序的代码
}
int main() {
srand(time(0));
int a[100000];
for (int i = 0; i < 100000; i++) {
a[i] = rand() % 100 + 100; // 生成100到1100之间的随机整数
std::cout << a[i] << '\t';
}
// 接下来进行选择排序和时间计算的代码
return 0;
}
```
C++中的随机数生成主要依赖`rand()`和`srand()`函数,通过合理地设置和使用它们,可以满足各种随机数生成的需求。