15

我目前被困在随机发生器中。需求规范显示了一个这样的示例:

Random rand = new Random(3412);

rand 结果不直接给出,而是用于其他性能。

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

生成的结果是518435373,我用同样的代码在网上c#编译器上试过,但是生成的结果不一样,是11688046,其余的性能结果也和样例不一样。

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

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

4

4 回答 4

17

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

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

构造函数的文档Random(int)指出:

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

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

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

于 2012-08-31T11:34:56.013 回答
9

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

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

确实,Random的文档说:

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

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

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

于 2012-08-31T11:35:53.297 回答
1

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

于 2012-08-31T11:41:27.700 回答
0

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

于 2012-08-31T11:36:42.400 回答