【问题标题】:srand(0) and srand(1) give the same results? [duplicate]srand(0) 和 srand(1) 给出相同的结果? [复制]
【发布时间】:2014-12-09 18:44:21
【问题描述】:

srand(0)srand(1) 给出相同的结果。 srand(2)srand(3)等给出不同的结果。

seed = 0seed = 1 产生相同随机序列的任何原因?

在手册页中找不到解释。只有在没有提供种子的情况下,才会使用seed = 1

谢谢。

【问题讨论】:

  • 显然 0 意味着没有种子,正如你所说,导致种子 == 1。
  • 为什么它们应该不同?
  • @mah:我认为没有种子意味着 srand() 没有被调用。
  • OP:请先尝试搜索。如果您在搜索框中输入srand,第一个结果就会回答您的问题。
  • @DoxyLover:我在发布之前和发布期间(在建议中)进行了搜索,但搜索字符串没有返回您提到的问题,并且这个问题与该问题重复。我也用谷歌搜索。看似显而易见的事情并不总是正确的。

标签: c random srand


【解决方案1】:

srandom_r(别名为srand)的glibc 源中,line 179

/* We must make sure the seed is not 0.  Take arbitrarily 1 in this case.  */
if (seed == 0)
    seed = 1;

这基本上只是一个随意的决定。

【讨论】:

    【解决方案2】:

    取决于编译器!

    srand(0);
    int a=rand(),b=rand();
    srand(1);
    int c=rand(),d=rand();
    

    VC 2005 结果:

    a    0x00000026    int
    b    0x00001e27    int
    c    0x00000029    int
    d    0x00004823    int
    

    【讨论】:

      【解决方案3】:

      这是一个依赖于实现的行为。

      例如,POSIX.1-2001 给出了以下实现 rand() 和 srand() 的示例

      static unsigned long next = 1;
      
      /* RAND_MAX assumed to be 32767 */
      int myrand(void) {
          next = next * 1103515245 + 12345;
          return((unsigned)(next/65536) % 32768);
      }
      
      void mysrand(unsigned seed) {
          next = seed;
      }
      

      现在,如果你使用这个实现,你最终会得到:

      0
      16838
      

      分别用于srand(0)srand(1)

      参考: http://linux.die.net/man/3/rand

      我之前遇到过一个非常相似的问题,rand() 在不同平台上为同一个种子产生了不同的序列。经验教训,可移植代码应该实现他自己的 PRNG。

      【讨论】:

        【解决方案4】:

        函数 srand() 用于通过传递参数种子来初始化伪随机数生成器。

        因此,如果种子设置为 1,则生成器将重新初始化为其初始值。然后它将产生与调用 rand 和 srand 之前一样的结果。

        所以 srand(1) 实际上代表了结果 srand(0)。

        【讨论】:

        • 太棒了,但无论如何这如何解决 OP 的 为什么 0 和 1 都产生 same prng 序列的问题?
        猜你喜欢
        • 2022-12-22
        • 2011-12-24
        • 1970-01-01
        • 1970-01-01
        • 2021-11-27
        • 2021-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多