【发布时间】:2020-02-11 18:12:10
【问题描述】:
我写了下面一段代码在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。
【问题讨论】:
-
这是因为
rand()是垃圾。不要使用它。使用实际有效的C++ random number generators。 -
rand()是垃圾,但这不是原因 -
停止在新代码中使用
srand/rand。使用<random> 标头中提供的现代设施。另见rand() Considered Harmful。 -
(rand() % MAX_VAL)引入了偏见,除非MAX_VAL可以完美地划分为RAND_MAX。 -
@idclev463035818 是的,但
#define也是垃圾,如果可以避免的话,也与 C++ 代码无关。
标签: c++ random random-seed