【问题标题】:What is drand48() default seed in C?什么是 C 中的 drand48() 默认种子?
【发布时间】:2018-06-12 12:47:40
【问题描述】:

我想知道drand48() 的默认种子是什么,即如果我在调用drand48() 之前没有明确使用srand48()

我查看了glibc 2.23(我目前正在使用的版本)的源代码,我认为它是零,但是如果有人可以验证它,那就太好了。

【问题讨论】:

  • 这似乎是一个奇怪的问题。你为什么不想打电话给srand48()
  • 不是我不想叫它。是我忘记这样做了。让我解释一下。
  • 我创建了一个使用 drand48() 的程序,我必须使用不同的参数集进行大量实验,其中还有 5 个不同的随机种子。我在没有明确调用 srand48() 的情况下运行了第一组实验,这些实验大约需要 2 周才能完成。显然,我还需要跟踪我用于实验的种子(以及其他参数)。所以,这就是为什么我需要知道默认种子。显然,我更愿意使用我已经得到的结果,节省 2 周的时间,并且只用不同的种子再运行 4 组实验。
  • @IoannisE.Venetis:这应该进入你的问题,而不是 cmets。因为对您而言真正重要的不是drand48 的标准规范,而是您特定的glibc 2.23 实现

标签: c posix default seed


【解决方案1】:

POSIX 没有强加特定值,相反,它表示应该调用其中一个初始化函数:

srand48()seed48()lcong48() 函数正在初始化 入口点,其中一个应在 drand48() 之前调用, 调用lrand48()mrand48()。 (虽然不推荐 实践中,应提供常量默认初始值设定项 如果 drand48()lrand48()mrand48() 没有被调用,则自动 对初始化入口点的先前调用。)

更一般地说,使用使用全局共享状态的函数并不是一个好主意。这组函数具有将其状态作为函数参数接收的备选方案。

如果您不调用任何这些初始化函数,则使用括号中的短语。它基本上说应该使用默认值初始化内部状态。这不等同于使用特定参数调用srand48,因为该函数将低位设置为固定值0x330。它可能相当于调用seed48(0, 0, 0),但这并不完全清楚。术语常量默认初始值设定项可能意味着每个实现都提供其默认值,或者应该使用 C 的默认初始值设定项(所有位 0)。

【讨论】:

  • 亲爱的 Jens,感谢您的回答。我已经知道这一切,我已经阅读了文档。请参考我对 Kevin 的回答,了解为什么我需要了解我使用的特定 glibc 版本的这些信息。
  • 亲爱的 Jens,提到 seed48() 解决了我的问题,因为此函数返回内部状态的先前值。我进行了测试,并且确实在我使用的 glibc 版本的情况下,初始化就像调用了seed48() 一样,它的参数是一个由 3 个无符号短裤组成的数组,所有这些都初始化为 0。事实上,这与使用参数 0 调用 srand48(),因为在这种情况下低位设置为 0x330E,正如您已经提到的。谢谢你的帮助!你为我节省了 2 周的等待时间 :-)
  • @IoannisE.Venetis,很高兴为您提供帮助。是的,在您的特定情况下,这意味着您的特定运行已经完成,就好像您已经通过调用 seed48(0, 0, 0) 对其进行了初始化一样,并且它应该可以重现。
猜你喜欢
  • 1970-01-01
  • 2014-09-30
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
相关资源
最近更新 更多