首页 > 解决方案 > 为什么 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。

标签: c++randomrandom-seed

解决方案


问题是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>


推荐阅读