【问题标题】:Crossplatform random number generator跨平台随机数生成器
【发布时间】:2020-06-29 23:07:49
【问题描述】:

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

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

【问题讨论】:

标签: c# random


【解决方案1】:

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

【讨论】:

  • Colin Green 对Xorshift RNGs 的实现似乎正是我所追求的,但我不确定它的许可协议是什么。 GPL 甚至 LGPL 与此项目不兼容。
  • @Mr.Smith 我会直接给他写信询问,但链接页面确实包含“本文已根据知识共享署名 3.0 许可获得许可”
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    从 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

    【讨论】:

    猜你喜欢
    • 2021-02-22
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    相关资源
    最近更新 更多