C ++。 RNG是否有可能在使用相同种子的两台不同机器中提供不同的随机变量?

时间:2009-01-21 13:53:09

标签: c++ gcc random

我有这个冗长而复杂的源代码,它使用带有修复种子的RNG。

此代码是模拟器,此模拟器的参数是此RNG给出的随机值。 当我在同一台机器上执行代码时,无论我做了多少尝试,输出都是一样的。但是,当我在两台不同的机器上执行此代码并比较两台机器的输出时,它们是不同的。

两台不同的机器是否有可能使用相同的随机数生成器和相同的种子以某种方式提供不同的输出?

编译器版本,库和操作系统是相同的。

7 个答案:

答案 0 :(得分:9)

当然可以,因为RNG可能正在将机器特定数据与种子(例如网卡地址)组合以生成随机数。它基本上是特定于实现的。

答案 1 :(得分:5)

由于它们确实给出了不同的结果,显然它们可能会给出不同的结果。容易回答的问题,接下来!

严重的是:在不知道RNG的源代码的情况下,很难知道您是在观察错误还是功能。但听起来有问题的RNG正在使用来自其他地方的第二粒种子,例如当前时间或某些与硬件相关的值,如网卡的MAC地址。

答案 2 :(得分:5)

如果您需要可以在机器之间重复的事情,请尝试Boost Random Number Library

答案 3 :(得分:4)

如果它是一个伪随机生成器,除了种子之外什么都不使用它来生成数字序列,那么按照定义它们就不能有所不同。但是,如果您正在使用的是使用依赖于机器的东西来扰乱种子,或者非常简单地使用不同的算法,那么它当然是非常有可能的。您正在使用哪种实现,如果它是标准库实现,它们是否都是相同的版本?

答案 4 :(得分:2)

是。例如,有浮点RNG,其结果可能取决于您的CPU是否正确实现IEEE浮点数(在ISO C ++中不保证)。此外,诸如将80位溢出到内存的效果会影响结果。

对于“种子”的概念也存在一些可能的混淆。有些人将种子定义为设置RNG初始状态的所有输入。其他人将其限制为仅代码中的显式输入,并排除来自例如的隐式输入。硬件源或/ dev / random。

答案 5 :(得分:0)

也许这是一个小/大端的问题,或者代码以某种方式检测处理器。最简单的方法是使用断点或类似的调试程序来观察播种程序和RNG本身的工作。

答案 6 :(得分:-1)

这在很大程度上取决于您使用的RNG。像random(3)rand48(3)系列这样的东西设计为在使用相同种子运行时返回相同的序列。现在,如果您使用的RNG取/dev/random输出,则所有投注均已关闭且结果将不同。