每台机器使用相同的种子生成相同的随机数结果吗?

时间:2012-08-31 11:29:03

标签: c# .net random seed

我当前卡在随机发生器中。需求规范显示了这样的示例:

Random rand = new Random(3412);

rand结果不会直接发出,而是用于其他表现。

我写了与上面相同的代码,以通过种子3412生成随机数。 然而,其余表现的结果与样本完全不同。

生成结果是518435373,我使用了在线c#编译器上尝试的相同代码,但得到的生成结果为11688046,其余的性能结果也与样本不同。

所以我只是想知道在不同的机器上应该有所不同吗?

顺便说一句,任何人都可以从你的机器上提供结果,看看它是否跟我一样。

4 个答案:

答案 0 :(得分:14)

我希望任何一个实现为相同的种子提供相同的序列,但可能涉及不同的实现。例如,“在线C#编译器”最终可能会使用Mono,我希望它与.NET中的实现具有不同的实现。

我不知道.NET的版本之间的实现是否发生了变化,但同样,这似乎完全有可能。

Random(int)构造函数的文档说明:

  

为不同的Random对象提供相同的种子值会导致每个实例产生相同的随机数序列。

...但它没有指定不同版本的含义等等。哎呀,它甚至没有说明x86和x64版本是否会给出相同的结果。我希望在任何一个特定的CLR实例中都有相同的结果(即一个进程,而不是两个并行运行的CLR,*。

如果你需要更稳定的东西,我会从指定的算法开始 - 我打赌可以使用Mersenne Twister等实现。

答案 1 :(得分:7)

没有指定做出这样的承诺,所以你应该假设它没有。

任何规范的好规则都不是做出合理使用不需要的承诺,所以你以后可以更自由地改进。

确实,Random的文件说:

  

Random类的当前实现基于Donald E. Knuth的减法随机数生成器算法。

请注意“当前实施”这一短语,暗示将来可能会发生变化。这非常强烈地表明,不仅没有承诺在版本之间保持一致,而且也没有意图。

如果规范要求一致的伪随机数,那么它必须指定算法以及种子值。实际上,即使Random被指定为做出这样的承诺,如果您将来需要非.NET实现全部或部分规范 - 或者与其互操作的东西 - 会怎样?

答案 2 :(得分:1)

这可能是由于不同的框架版本。看看this

答案 3 :(得分:0)

您尝试过的在线提供程序可能会使用CLR的Mono实现,这与Microsoft提供的不同。所以他们的Random类实现可能有点不同。