【问题标题】:Why are the outputs of the same code using Linux and visual studio different?为什么使用 Linux 和 Visual Studio 的相同代码的输出不同?
【发布时间】:2021-11-12 08:30:03
【问题描述】:

我在两个不同的环境(Linux 和 Visual Studio)中编译了完全相同的代码。但我注意到输出不一样。我试图以不同的方式解决这个问题,但失败了。 我需要知道为什么?

是我错过了什么还是什么?

我希望输出保持不变,以继续推进我的项目。谁能帮忙。

我的代码:

void mix_dataset(array<array<int, 20>, 5430>& array_X_dataset, array<int, 5430>& array_Y_dataset) {
    size_t len = array_X_dataset.size();
    for (size_t i = 0; i < len; ++i) {
        size_t swap_index = rand() % len;  
        if (i == swap_index)
            continue;

        array<int, 20> data_point{  };
        data_point = array_X_dataset[i];
        array_X_dataset[i] = array_X_dataset[swap_index];
        array_X_dataset[swap_index] = data_point;
        int Y = array_Y_dataset[i];
        array_Y_dataset[i] = array_Y_dataset[swap_index];
        array_Y_dataset[swap_index] = Y;
    }
}
       
int main()
{

    string filename = ".//dataset.csv";
    static array<array<int, 20>, 5430> array_X_dataset{};
    static array<int, 5430> array_Y_dataset{};

    bool error = read_data_set(filename, array_X_dataset, array_Y_dataset);
    if (error) {
        printf("Exiting with error while reading dataset file \n");
        exit(-1);
    }
    

    srand(3);
    mix_dataset(array_X_dataset, array_Y_dataset);
 
   int* array_Y_set = new int[5430];
    int** array_X_set = new int* [5430];
    for (int i = 0; i < 5430; i++) {
        array_X_set[i] = new int[20];
    }
    
    for (int i = 0; i < 5430; i++) {
        for (int j = 0; j < 20; j++)
            array_X_set[i][j] = array_X_dataset[i][j];
        array_Y_set[i] = array_Y_dataset[i];
    }
      printf("printout the whole dataset after random mixing:\n"); // the outputs are different 
      for (int i = 0; i < 5430; i++) {
          printf(" %d ", i);
          for (int j = 0; j < 20; j++)
              printf(" %d ", array_X_set[i][j]);
          printf(" %d ", array_Y_set[i]);
          printf("\n");


      }
}

    

【问题讨论】:

标签: c++ linux visual-studio


【解决方案1】:

您正在使用rand() 来随机化输出。 rand() 可以在不同的实现中使用不同的伪随机数生成器。因此,在为 Windows 和 Linux 编译和运行代码时,使用相同的种子 (srand(3)) 并不足以保证获得相同的结果。详情请见此处:Why does the C++ stdlib rand() function give different values for the same seed across platforms?(感谢 phuclv 提供链接)。

我对@9​​87654326@ 不是很熟悉,也许在这里可以提供帮助。不过,引用 Mgetz 的评论:

不幸的是,已指定但未指定得足够好,无法跨工具链甚至版本重现。也就是说,它仍然比 rand() 好很多

如果是这种情况,您可以使用一些代码将一系列随机数写入文件,然后从同一文件中读取数字,而不是直接使用rand()。通过这种方式,无论您在何处运行代码,都可以确保使用相同的随机数序列。当然,您可能会看到不同的结果,但是您知道原因不是rand(),而是在您的代码中。首先,您需要排除该偏差来源。

但是,引用 Pete Beckers 的评论:

中的生成器是完全指定的,并且需要在所有实现中生成相同的序列。分布不是。因此,如果您只是创建原始数字并管理自己的分布(正如问题中的代码对 rand() % len 所做的那样,&lt;random&gt; 提供了完全正确的工具。

【讨论】:

  • &lt;random&gt; 中的 生成器 已完全指定,并且需要在所有实现中生成相同的序列。 分布不是。因此,如果您只是创建原始数字并管理自己的分布(因为问题中的代码试图与 rand() % len 相关,&lt;random&gt; 提供了完全正确的工具。
  • @Pete Becker 我想你不介意我在答案中引用它。无论如何,我只是想总结一下 cmets 中所说的内容,以免丢失
  • @463035818_is_not_a_number -- 随意!
【解决方案2】:

您使用的 IDE 不同。 IDE 编译器的工作方式可能不同。

【讨论】:

  • 是的我知道,但是如何让两个实现生成相同的随机数
  • 嗨,梅里克!欢迎来到 StackOverlow,感谢您尝试回答这个问题。事实上,这个问题源于不同的环境,但很可能是 rand() 的实现而不是 IDE 本身。除非您确定,否则请考虑不要给出答案;否则建议将其作为评论的潜在原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-03
  • 2021-04-17
相关资源
最近更新 更多