【问题标题】:How does/ is srand calcuted? [duplicate]srand 是如何计算的? [复制]
【发布时间】:2020-09-15 11:41:43
【问题描述】:

我的问题很简单。我知道 abour srand 和 rand,我知道如何播种我的随机生成器等等。我对 srand 背后的数学特别感兴趣。计算机如何使用比方说 3333 作为种子并计算“随机”数?

【问题讨论】:

  • 网上有不少简单的伪随机数生成器的例子,随便搜一下。但是要能够理解和编写一个好的生成器,需要大量的学习和经验,包括大量的数学和统计知识。
  • 我不明白这个问题,当您调用 srand 时,您将种子作为参数传递。您想知道第一个随机数是如何从该种子生成的吗?
  • 我们以 srand(time) 为例。这里第一个数字总是跟随 UNIX 时间,这是有道理的。其他数字是通过使用前一个数字作为种子生成的。但问题是 srand 如何获取种子并计算下一个“随机”数?计算机从不做“随机”的事情,但可以使用数学来执行看似“随机”的事情。
  • 附言。对不起我在 Stack 上的形式,我在这里完全是新人,需要学习一下以了解如何突出显示事物等等((:

标签: c++


【解决方案1】:

c 标准库以及 c++ 标准库的 std::rand 实现取决于库实现。它不是标准规定的。下面的函数

(来源:https://xkcd.com/221/

这将是一个完全有效的实现。

这就是在任何情况下都不应再使用它的原因。而是遵循定义明确、独立于实现且可移植的mersenne twister

【讨论】:

  • 你比我早了 1 秒才找到图片:P
  • @idclev463035818 好吧,如果有什么安慰的话,这通常发生在我身上:)
  • 是的,但是这样的实现将是一团糟。确实是随机的,但没有什么比恒定值更具确定性了。所以我不确定是否有人会在实践中称这样的实现“有效”(即使它不违反标准)。
  • @Fareanor 我认为部分笑话是,除非您知道它是如何实现的,否则您无法区分这与真正的 prng 之间的区别
  • @Someprogrammerdude 也许吧,但我不会很高兴能以任何方式与 Scott Adams 或他的工作联系在一起。
【解决方案2】:

这取决于库的实现,但一般来说,计算参数的良好混合散列就足够了。

【讨论】:

    猜你喜欢
    • 2016-01-19
    • 2012-11-03
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2013-07-05
    • 2016-10-20
    相关资源
    最近更新 更多