C# 是否每台机器都使用相同的种子生成相同的随机数结果?

C# 是否每台机器都使用相同的种子生成相同的随机数结果?,c#,.net,random,seed,C#,.net,Random,Seed,我的电流卡在随机发生器里。需求规范显示了如下示例: Random rand = new Random(3412); rand结果不是直接给出的,而是用于其他性能 我编写了与上面相同的代码,通过种子3412生成一个随机数。 然而,rest性能的结果与样本完全不同 生成结果是518435373,我使用了在线c#编译器上尝试过的相同代码,但得到的生成结果不同,即11688046,其余性能结果也与示例不同 所以我只是想知道,在不同的机器中,这应该是不同的吗 顺便说一句,任何人都可以从你的机器上提供结果

我的电流卡在随机发生器里。需求规范显示了如下示例:

Random rand = new Random(3412);
rand结果不是直接给出的,而是用于其他性能

我编写了与上面相同的代码,通过种子3412生成一个随机数。 然而,rest性能的结果与样本完全不同

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

所以我只是想知道,在不同的机器中,这应该是不同的吗

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

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

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

建造商的文件说明:

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

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


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

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

对于任何规范来说,一个好的规则就是不要做出合理使用所不需要的承诺,这样你以后就可以更自由地改进事情

事实上,
Random
的文档说明:

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

请注意“当前实现”一词,这意味着将来可能会发生变化。这非常强烈地表明,不仅没有承诺在版本之间保持一致,而且也没有打算这样做


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

您尝试的提供商可能使用CLR的Mono实现,这与Microsoft提供的不同。因此,他们的
随机
类实现可能有点不同。

这可能是由于不同的框架版本造成的。查看一下您可以轻松地自己测试这一点。如果相同的随机数出现在t、 你会得到一个给定种子的随机数,比如说1000次,如果你再次运行测试,你会得到同样的1000个数字。所以你可以很快地测试它,发现不是这样。@Bridge:它不是随机数。它是一个伪随机数生成器。@Bridge:不,一点也不。请阅读我回答中引用的文档。@JonSkeet我想我搞错了rstood OP询问的内容-删除了我的原始评论!@BugFinder我已经测试了几十次,结果相同,我的意思是第一个生成的随机数与518435373相同。它在某种程度上被指定为做出这样的承诺…只是没有很好地指定:“为不同的随机对象提供相同的种子值会导致每个实例产生相同的随机数序列。”-不幸的是,这并不能说明不同版本的稳定性:(@JonSkeet这是我所说的唯一承诺。是否可能由于visual studio的不同版本,我使用的是2010 professional,但我猜示例代码使用的是2010express@IvanLi:不,那根本不会有什么不同。不过,针对不同版本的框架也可以。