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

Iva*_* Li 9 .net c# random seed

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

Random rand = new Random(3412);
Run Code Online (Sandbox Code Playgroud)

兰特结果不是直接给出的,而是用于其他表现.

我写了与上面相同的代码,通过种子3412生成随机数.但是,其余性能的结果与样本完全不同.

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

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

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

Jon*_*eet 14

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

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

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

向不同的随机对象提供相同的种子值使得每个实例产生相同的随机数序列.

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

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


Jon*_*nna 7

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

任何规范的好规则都不是做出合理使用不需要的承诺,因此您可以更自由地在以后改进.

的确,Random文件说:

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

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

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