13

当您需要能够从种子中生成随机数,并保证它在不同版本的 .NET Framework 和 Mono Framework 以及不同架构(x86、x64)之间是相同的数字时,您会怎么做?做?

我目前正在考虑将数百万个随机字节存储在一个文件中以用作此问题的临时解决方案,但我认为可能有更好的方法(希望不会太复杂)。

4

3 回答 3

15

如果您需要真正可移植的实现,最好的选择可能是只使用自定义随机数生成器,例如这个Mersenne Twister 实现Colin Green 的快速随机数生成器。通过控制实施,您可以保证在任何平台上使用相同的种子,您将获得相同的结果。

于 2013-06-13T18:20:12.640 回答
3

还有Troschuetz.Random可以通过 NuGet 获得的库,它提供了几种“标准”随机化方法,可能也可以在其他平台上使用:

完全托管的库,提供各种随机数生成器和分布。更准确地说,这个库提供了 7 个生成器(ALF、MT19937、Standard、XorShift128、NR3、NR3Q1、NR3Q2)、6 个离散分布(Bernoulli、Binomial、Categorical、DiscreteUniform、Geometric、Poisson)和 21 个连续分布(如正态分布、指数分布、 ChiSquare、Beta 等);此外,它提供了一个类似于 Python 提供的随机类(TRandom)。

这个库背后的所有辛勤工作都是由 Stefan Troschütz 完成的,并由 Alessio Parma 在这个 .NET 包中进行了优化。

于 2018-09-14T22:19:32.640 回答
1

从 Wiki 获得以下代码:http ://en.wikipedia.org/wiki/Random_number_generation

m_w = <choose-initializer>;    /* must not be zero */
m_z = <choose-initializer>;    /* must not be zero */

uint get_random()
{
    m_z = 36969 * (m_z & 65535) + (m_z >> 16);
    m_w = 18000 * (m_w & 65535) + (m_w >> 16);
    return (m_z << 16) + m_w;  /* 32-bit result */
}

这应该是您需要的:http ://en.wikipedia.org/wiki/Linear_congruential_generator

于 2013-06-13T18:19:47.700 回答