【问题标题】:Does the srand function work over multiple translation units? [closed]srand 函数是否适用于多个翻译单元? [关闭]
【发布时间】:2020-12-08 16:49:35
【问题描述】:

如果我在main 函数中调用srand,是否也会影响我在其他翻译单元中的函数的结果?

【问题讨论】:

  • 它会影响由多个翻译单元构建的执行程序。:)
  • @VladfromMoscow 你能把它作为答案发布吗?
  • srand 由库提供,并与可执行文件(更具体地说,正在运行的可执行文件的一个实例,即进程)链接。可执行文件不区分不同的源文件/翻译单元。它将影响将来在可执行文件中对rand 的所有调用,无论函数调用它(main 或其他)。但是,它不会影响不同的进程。因此,在一个进程中调用srand 不会影响父进程或兄弟进程。它将影响随后产生的孩子。
  • 取决于实现。该标准仅要求使用相同种子生成的数字序列每次都相同...return 4; 是rand() 的有效(尽管质量非常低)实现@ --- mandatory xkcd --- 如果您将线程添加到组合中,然后所有赌注都关闭了!
  • @pmg 还有mandatory Dilbert.

标签: c random srand


【解决方案1】:

C 翻译单元限制了在其中声明的一些标识符 的范围,但不限制属于程序的任何实际函数或对象。因此,程序状态不能是特定于 TU 的,因为它因不同的 TU 而异。

具体来说,然后,在程序的任何特定线程中,只执行定义的行为,通过srand() 设置的随机数种子在一个 TU 中的代码与同时在不同 TU 中的代码看起来不同.

【讨论】:

    【解决方案2】:

    来自glibc源码的一些小资料。

    srand 是__srandom 的弱别名。 (Source)。

    __srandom 呼叫__srandom_r (Source)。

    __srandom_r 只是根据种子更新传递给它的struct random_data。 (Source)

    rand(void) 只是打电话给__random。 (Source)。

    __random 调用 __random_r,传递与传递给 __srandom_r 相同的结构。 (Source)。

    __random_r 然后从传递的结构中生成一个随机值。 (Source)。

    因此,简而言之,在您的主函数中调用 srand 将影响其他每个函数中的随机数,而您的程序运行时,因为状态在所有函数之间共享。

    【讨论】:

    • rand 通常不被认为是线程安全的或可重入的(尽管在您上面链接的 glibc/random.c 文件中它似乎是线程安全的)。
    • 更一般地说,glibc 是如何做到的(任何事情)并不能可靠地表明其他 C 库如何做到这一点,除非 glibc 符合标准。
    • @JohnBollinger 你是对的,但我认为,人们会知道,这将取决于库和如何实现rand/srand 的标准一致性。此外,我使用了 glibc,因为它经常在 linux 系统上找到
    • @JCWasmx86,很多不知道或理解的人会看到这个答案。此外,OP 没有指定特定的实现,更不用说特别是基于 glibc 的实现。既然您确实知道 glibc 详细信息并不表示其他实现的详细信息,那么,我不清楚您为什么认为这完全响应了 OP 的问题。
    猜你喜欢
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    相关资源
    最近更新 更多