【问题标题】:Lucky Draw (Random Number Generation) [closed]幸运抽奖(随机数生成)[关闭]
【发布时间】:2012-06-14 11:19:11
【问题描述】:

我需要具有以下功能的抽奖软件或程序环境:

  • 完全随机选择法

  • 不使用明确的种子和增量(不可预测的方式)

  • 不依赖于第一次选择

  • 随机数可以根据时间、温度、互联网流量、大气噪声等环境因素生成,但不能通过简单的随机数学函数生成。

你能帮我解决这个问题吗?

谢谢

【问题讨论】:

  • 你试过什么?这里和更广泛的互联网上有很多关于 PRNG 的信息。
  • 也许正在寻找硬件 RNG?en.wikipedia.org/wiki/…
  • 所以你是说你想要一个不使用种子但使用时间等因素作为种子的随机数生成器?
  • 您需要多久生成一次数字?一天一次就够了吗?
  • 您可能会发现加密 RNG 比普通 RNG 更符合您的标准。看看你的语言为加密使用提供了什么,或者实现 Yarrow、Fortuna 或类似的东西。

标签: random numbers generator


【解决方案1】:

如果您所说的“幸运抽奖”是指您每天只需要一个数字,那么您可以使用可公开访问的股票市场指数(例如 NASDAQ 或 S&P 500)的低位数字,包括小数位. 您还可以使用其中几个索引,并使用哈希函数混合数字以获得单个更大的数字。

【讨论】:

    【解决方案2】:

    有一种方法可以通过计算生成随机数,它被 George Marsaglia 称为带有进位的乘法。这种方法的优点是它不是基于增量的,也不是在模式中播种的。相反,它有一个随机种子。

    P.S 这个应用程序不是线程安全的

    http://en.wikipedia.org/wiki/Multiply-with-carry

    代码来自这篇文章:http://en.wikipedia.org/wiki/Random_number_generation#Computational_methods

    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 */
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      相关资源
      最近更新 更多