c++ - 为什么 rand 每次都给我几乎相同(但略有不同)的数字
问题描述
我编写了以下代码以在 C++ 中生成随机数
#include <stdlib.h>
#include <iostream>
#include <ctime>
#define ARRAY_SIZE 5
#define MAX_VAL ARRAY_SIZE*5+1
int main() {
srand(time(NULL));
int arr [ARRAY_SIZE];
for (int i = 0; i < ARRAY_SIZE; i++) {
arr[i] = (rand() % MAX_VAL);
}
for (int i = 0; i < ARRAY_SIZE; i++) {
printf ("%d\n", arr[i]);
}
return 0;
}
当我运行它时,我每次都会得到几乎相同的数字:
tyler@Tylers-MacBook-Pro hw2 % ./MergeSort
11
16
16
21
16
tyler@Tylers-MacBook-Pro hw2 % ./MergeSort
21
11
21
11
6
tyler@Tylers-MacBook-Pro hw2 % ./MergeSort
6
6
1
16
6
tyler@Tylers-MacBook-Pro hw2 % ./MergeSort
16
1
16
6
21
tyler@Tylers-MacBook-Pro hw2 % ./MergeSort
1
21
21
11
21
tyler@Tylers-MacBook-Pro hw2 % ./MergeSort
1
21
21
11
21
tyler@Tylers-MacBook-Pro hw2 % ./MergeSort
11
16
1
1
11
tyler@Tylers-MacBook-Pro hw2 % ./MergeSort
11
16
1
1
11
tyler@Tylers-MacBook-Pro hw2 % ./MergeSort
21
1
6
6
1
为什么我的随机数生成器只给我以下值:1、6、11、16 和 21?这对我来说毫无意义。我确保播种它并且数字并不总是以相同的顺序排列,这使得这更加令人困惑。作为旁注,我使用的是 OSX。
解决方案
问题是MAX_VAL
定义为ARRAY_SIZE*5+1
,而不是(ARRAY_SIZE*5+1)
。这意味着您的使用arr[i] = (rand() % MAX_VAL);
扩展为:
arr[i] = (rand() % 5 * 5 + 1);
没有很多选择(只有 5 种可能性),这就是为什么您看到相同的数字。您可以通过将定义括MAX_VAL
起来或使其成为常量变量来解决此问题:
const unsigned int MAX_VAL = ARRAY_SIZE * 5 + 1;
第二个问题是使用srand(time(NULL))
. 在大多数系统上,time
如果程序在同一秒内运行,将返回相同的值。这意味着快速连续运行程序(在同一秒内)将产生相同的结果。最好使用 中的 PRNG 设施<random>
。
推荐阅读
- python - 使用 loc 从 numpy 数据框中获取单元格值
- r - 如何对excel文件使用合并功能?
- delphi - TEdgeBrowser 弹出菜单/上下文菜单
- web-services - 为什么 Oracle OSB 业务服务需要花费如此多的时间来请求外部 Web 服务?
- javascript - 函数返回每个嵌套数组中最长的数
- python - plotly express:同一列中的多个数据系列->在一个图中绘制
- multithreading - 超线程处理器的最佳线程与核心比率
- r - 在组合数字和非数字的字符串数组中,提取非数字子字符串,然后是 R 中的数字子字符串
- c++ - 是否可以通过 std::upper_bound 对 std::map 进行有效和部分搜索?
- ios - 函数声明一个不透明的返回类型