Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Windows和Linux上的不同rand()结果_C++_Random - Fatal编程技术网

C++ Windows和Linux上的不同rand()结果

C++ Windows和Linux上的不同rand()结果,c++,random,C++,Random,我注意到,标准的rand()函数在Windows和Linux上给出了不同的结果。当然,我使用了相同的种子编号(1234)。以下是几个初步结果: 赢:4068213 127618758 林:479142414 465566339 961126155 1057886067 我的应用程序要求两个平台产生相同的输出。 我有什么选择?是否有符合我要求的rand()替代品 谢谢 另外,我在Windows7上使用了MSVC 2008,在CentOS 5.5上使用了gcc 4.1.2。由于两种平台上的功能实现不

我注意到,标准的rand()函数在Windows和Linux上给出了不同的结果。当然,我使用了相同的种子编号(1234)。以下是几个初步结果:

赢:4068213 127618758

林:479142414 465566339 961126155 1057886067

我的应用程序要求两个平台产生相同的输出。 我有什么选择?是否有符合我要求的rand()替代品

谢谢


另外,我在Windows7上使用了MSVC 2008,在CentOS 5.5上使用了gcc 4.1.2。由于两种平台上的功能实现不同,您不会得到相同的结果。

Boost有一个新的功能,可能在不同平台上具有可复制的行为。

  • 写你自己的(不推荐)
  • 使用图书馆。e、 g
您可以尝试srand(int),它根据种子(输入)生成随机数

--
干杯

我想你甚至会发现不同的linux版本返回不同的值,以及不同的windows版本返回不同的值

例如,您可以使用glibc one统一您的随机生成器


您的另一个选择是编写自己的函数,但是只有在您100%确定不需要将随机函数用于加密用途或任何其他需要该函数具有不可预测性、统一性或其他随机属性的用途时,才可以编写自己的函数。

如果您对该标准感到满意
rand
实现,并且只需要可复制性,您可以轻松编写自己的(适应C接口,可能不是一个好选择!–而是使用类):

这使用了维基百科文章中的常量(ansic:Watcom)

也就是说,我更愿意使用Boost的read-Make实现,正如其他人所建议的那样。

这个rand()实现与windows中的rand()实现的结果类似。 我们可以使用下面的代码在linux中复制windows rand()

srand(seed) { 
    random_seed = seed; 
  } 

  rand() { 
    random_seed = (random_seed * 214013 + 2531011) & 0xFFFFFFFF; 
    return (random_seed >> 16) & 0x7FFF; 
  }

为什么“不推荐”?LCG是一个简单的一个内衬,维基百科文章提供了一个常用的常数列表,它产生了或多或少的良好行为(与C标准库实现相一致)。。不建议这样做,因为实现的正确性很难测试,任何错误都不会立即显现出来,但在应用程序执行过程中可能会导致问题。还有,为什么要重新发明车轮?@Eamon:“为什么要重新发明车轮?”这是一个破碎的单衬套。下载Boost头文件(尽管这也是我推荐的第一个解决方案)肯定会有更多的工作要做。总的来说,我同意正确性。但再一次:这是一条单行线。我从维基百科上抄的。有什么不对劲吗?@Konrad:你可能需要比LCG更好的属性。虽然我同意@Konrad的观点,合理的LCG常量是可用的,并且一个的实现是微不足道的,但我仍然不会使用它,除非在速度或空间最有限的情况下,因为即使在绘制(x,y)时,它们也会遇到质量问题是的,但只有当底层算法和参数相同时,结果才会相同。为什么需要在不同平台上使用相同的随机数?毕竟,这不是很随机——你想实现什么?@eamonnerbanne可能的场景:应用程序在linux和cygwin下开发,并通过随机测试进行测试。每次测试都打印种子。如果测试确定了错误条件,则可以在种子的帮助下再现错误情况。如果想要在linux和cygwin上调试错误案例,如果
rand
在linux和cygwin.+1下返回相同的随机序列,以获得问题的正确答案,那将是非常好的(OP想要重现能力,而不是好的RNG)。只要记住在完成测试后使用好的RNG>;-)Boost-PRNG都参考了它们实现的算法和选择的参数。因此,不仅行为是可复制的,它还将被数学定义(即,有一个绝对的正确性标准)
srand(seed) { 
    random_seed = seed; 
  } 

  rand() { 
    random_seed = (random_seed * 214013 + 2531011) & 0xFFFFFFFF; 
    return (random_seed >> 16) & 0x7FFF; 
  }