我当前卡在随机发生器中。需求规范显示了这样的示例:
Random rand = new Random(3412);
rand结果不会直接发出,而是用于其他表现。
我写了与上面相同的代码,以通过种子3412生成随机数。 然而,其余表现的结果与样本完全不同。
生成结果是518435373,我使用了在线c#编译器上尝试的相同代码,但得到的生成结果为11688046,其余的性能结果也与样本不同。
所以我只是想知道在不同的机器上应该有所不同吗?
顺便说一句,任何人都可以从你的机器上提供结果,看看它是否跟我一样。答案 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
类实现可能有点不同。