【问题标题】:If I don't specify srand(), what seed does rand() use?如果我不指定 srand(),rand() 使用什么种子?
【发布时间】:2013-01-10 05:36:58
【问题描述】:

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    int r;
    int i;
    for (i = 0; i < 100; i++)
    {
        r = rand() % 100 + 1;
        printf("%d\n", r);
    }
    return 0;
}

我一直在尝试随机数,但是有一天,我忘记输入srand(),但是rand()函数仍然可以随机数(相同的顺序)。

问题是,如果我不指定它使用什么种子?

【问题讨论】:

    标签: c random srand


    【解决方案1】:

    如果 srand 没有被调用,rand 就像 srand(1) 被调用一样。

    http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.13.html#rand

    【讨论】:

      【解决方案2】:

      C 标准实际上规定了其他答案中记录的行为:

      ISO/IEC 9899:2011 §7.22.2.2 srand 函数

      ¶2 [...] 如果在调用 srand 之前调用了 rand,则应生成与第一次调用 srand 时相同的序列,种子值为 1。

      【讨论】:

        【解决方案3】:

        The man pages state the following:

        srand() 函数将其参数设置为新序列的种子 rand() 返回的伪随机整数。这些序列 可以通过使用相同的种子值调用 srand() 来重复。

        如果没有提供种子值,rand() 函数会自动 种子值为 1。

        【讨论】:

          【解决方案4】:
          If rand() is called before any calls to srand() are made, the same sequence shall 
          be generated as when srand() is first called with a seed value of 1.
          

          参考:

          http://pubs.opengroup.org/onlinepubs/009695399/functions/rand.html

          【讨论】:

            【解决方案5】:

            srand() 函数将其参数设置为 rand() 返回的新伪随机整数序列的种子。这些序列可以通过调用具有相同种子值的 srand() 来重复。

            如果没有提供种子值,则 rand() 函数会自动设置为 1 的种子值。

            【讨论】:

            • 欢迎来到 Stack Overflow。你在这里说的是正确的,但它非常重复其他早期答案所说的。这次我会给你怀疑和赞成的好处,但是当一个问题已经有许多答案与你要添加的信息相同时,你应该考虑是否应该添加你的答案。 (当我添加我的答案时,已经有两个很好的答案;然而,我添加了一个权威参考,说明为什么函数会如此行事——引用 C 标准。这个独特的信息是我添加答案的原因。 )
            • 对不起,没有意识到答案已经存在。从今以后不再重复。感谢您指出错误。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-20
            • 2014-05-01
            • 1970-01-01
            • 2020-08-25
            • 1970-01-01
            • 2021-03-11
            相关资源
            最近更新 更多