VC++生成随机数:rand与srand的使用详解

4星 · 超过85%的资源 需积分: 47 17 下载量 49 浏览量 更新于2024-10-26 收藏 96KB PDF 举报
"VC++中的随机数函数包括`srand`和`rand`,它们是生成伪随机数的关键。`srand`用于初始化随机数生成器的种子,而`rand`则用于生成实际的随机整数。`srand`通常与当前时间或者特定值结合使用以确保每次运行时的随机性。在生成随机数时,应当注意避免简单的取模操作,而应采用更精确的计算方式来获取指定范围内的随机数。下面是对这两个函数的详细解释和示例。 `srand(unsigned seed)`函数用于设置随机数生成器的初始种子。种子决定了随机数序列的起始点。如果使用相同的种子,`rand()`将生成相同的序列。在示例中,种子可以设置为1,但通常为了得到不可预测的结果,我们会使用当前时间作为种子,比如`time(NULL)`,这可以获取自1970年以来的秒数。另外,也可以使用进程ID`getpid()`作为种子,这在多进程环境中能确保每个进程的随机数序列独立。 `rand(void)`函数则用于生成一个`unsigned int`类型的伪随机数。默认情况下,`rand()`的取值范围是0到`RAND_MAX`之间。`RAND_MAX`是标准库定义的一个常量,表示`rand()`能产生的最大随机数。 生成指定范围内的随机数时,常见的错误是直接使用`rand() % n`,这种方法可能导致分布不均匀,尤其是在n接近`RAND_MAX`时。更好的做法是将`rand()`的结果除以`RAND_MAX + 1.0`的浮点数,然后乘以范围上限,这样可以得到更均匀的分布。例如,要生成0到100之间的随机整数,应使用`j = (int)(n * rand() / (RAND_MAX + 1.0))`。 以下是一个生成10个0到100之间随机整数的示例代码: ```cpp #include <stdlib.h> #include <stdio.h> #include <time.h> int main(void) { int i, k; srand((unsigned)time(NULL)); // 使用当前时间初始化种子 for (i = 0; i < 10; i++) { k = rand() % 101; // 注意,这里为了包含100,应使用%101 printf("k=%d\n", k); } return 0; } ``` 此外,C++标准库还提供了 `<cstdlib>` 中的 `rand()` 和 `<ctime>` 中的 `srand()` 函数,这两个函数也适用于C++编程。在C++11及更高版本中,还可以使用`<random>`库,它提供了更高级且可定制的随机数生成器,如`std::mt19937`,这允许生成更高质量的随机数,并且可以轻松地生成不同分布的随机数。