在不同的编译器中运行c++代码会产生不同的结果吗

Does running a c++ code in different compilers create different results

本文关键字:结果 运行 编译器 c++ 代码      更新时间:2023-10-16

当我在visualstudio中运行时,我有一个代码,我会得到不同的结果,而当我使用g++编译器运行时,会获得不同的结果。它的种子是1,所以我想这应该不会影响它。此外,代码的一些部分在线程中运行(但这部分不包含任何rand函数)

通过在同一平台上运行应用程序,我得到了相同的结果,但如果我使用不同的编译器,则会有所不同

对于标准定义的所有行为,所有编译器生成的程序必须以相同的方式运行。

对于标准未指定的所有行为,编译器不需要执行相同的行为。例如,该标准对违反该标准的程序不作任何保证。该标准还留下了许多细节有待实施。

此外,编译器往往不总是在所有情况下都符合标准,有些编译器可能不支持与另一个版本相同的标准。

最后,一些标准规则被发现是模棱两可的,不同的编译器可能选择了相反的解释。这些应记录为缺陷报告。

。。种子rand函数。。。

rand产生的随机序列是实现定义的。是的,不同编译器的结果可能不同。


C++11引入了<random>标头。在那里定义的随机数生成器中,default_random_engine是唯一一个具有实现定义行为的生成器。

如果您想要一个可复制的伪随机数,请使用C++工具,这样您就可以选择一个定义良好的生成器。

C伪随机数生成器不能保证在编译器或平台之间是相同的。

伪随机数的生成是一个非常棘手的问题。最好使用第三方图书馆。例如,GNU科学库中包含几个随机数生成器(https://www.gnu.org/software/gsl/)。当我需要一个可复制的随机数生成器时,我倾向于使用Mersenne Twister,这是GSL的默认值。

密码学的随机数生成是与其他库一起完成的。

你也可以测试你的发电机的质量是使用Die Harder II(https://www.phy.duke.edu/~rgb/General/diehard.php)。是的,从技术上讲,你无法判断某个东西有多随机,但如果你能在其中找到一个模式,它绝对不是随机的。