非决定论的来源

zoo*_*zoo 10 c++ random deterministic non-deterministic

我所谓的确定性程序会在不同的运行中产生一些略有不同的输出.输入,编译器和计算机是不变的.我不确定哪个输出是正确的,因为它看起来总是合理的.

除了对rand()的迷路调用之外,怎么可能呢?

Pét*_*rök 17

在几个方面:

  • 以涉及数据竞争的方式使用多个线程,
  • 使用当前系统时间作为输入,
  • 使用未初始化的变量,
  • ...

我们一定能够使更多的猜测,但如果你想获得有意义的帮助,也许这将是很好的为你发布你的代码的相关部分:-)


luk*_*uke 7

它可能是:

  • 线程计时
  • 任何类型的输入(用户,文件,网络等)


zr.*_*zr. 7

如果输出取决于堆上分配的地址:

int main(int argc, char* argv[])
{
   printf("%p", malloc(42));
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

对于每次运行,malloc()可能返回不同的虚拟地址 - 在分配失败的情况下更不用说NULL.

  • 接得好.堆/地址随机化现在是一个非常标准的功能.如果指针在某处被用作键,那将会产生影响.我在几次使用它来使排序稳定(如果键相等,则比较指针). (2认同)

fre*_*low 5

除了对rand()的迷路调用

rand() 只要你给它提供相同的初始种子,它就完全是确定性的.


Syl*_*sne 5

如果您的程序使用 float / double,如果某些架构上存在上下文切换,结果可能会有所不同。

在 x86 上,FPU 对中间结果使用扩展精度,但是当保存在内存中时(当进程或线程存在上下文切换时会发生这种情况),这种精度就会丢失。这可能会导致结果出现一些小偏差(我们在程序中检测到了此类问题)。避免此问题的一种方法是要求编译器不要使用 FPU 而使用 SSE 进行浮点运算。

http://www.network-theory.co.uk/docs/gccintro/gccintro_70.html