【问题标题】:rand() issue in C programming? [duplicate]C编程中的rand()问题? [复制]
【发布时间】:2012-04-20 19:45:35
【问题描述】:

可能重复:
Why do I always get the same sequence of random numbers with rand()?

所以,是的,这可能看起来有点无聊,但由于我在 Java 变得通情达理后自学 C,所以我已经遇到了一些麻烦。我正在尝试在 C 中使用 rand() 函数,但我只能调用一次,当它调用时,它总是生成相同的随机数,即 41。我使用的是 Microsoft Visual C++ 2010 Express,并且我已经设置好了它可以编译 C 代码,但唯一不起作用的是这个 rand() 函数。我试过包括一些常用的库,但没有任何效果。代码如下:

#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"

int main(void)
{
    printf("%d", rand()); //Always prints 41

    return 0;
}

【问题讨论】:

  • “出于某种原因”?没有错误信息?我觉得……不太可能。当说某事“不起作用”时,请尝试包括实际发生的事情。在这种情况下,这很容易,但提出一个完整的问题只是常识和礼貌。
  • 我在使用一次时没有收到错误消息,但是当我将它放入循环时会收到错误消息。这就是为什么我说“出于某种原因”。
  • 别忘了真正的随机性是不存在的;它总是伪随机性并且在每次运行时生成相同的伪随机序列是一个特征。可能,对您的情况没有用,尽管我相信值得了解。
  • 请注意,rand() 生成可重复/确定性序列的能力是有意的,有时很有用。通过根本不调用 srand() 或使用常量值调用它,序列每次都相同,这对于测试/调试很有用,当您可能不希望每次测试的行为都不同时。
  • 如果您调用time(),请不要忘记#include <time.h>,否则编译器将采用不同的原型并调用未定义行为。

标签: c random compilation


【解决方案1】:

这是因为rand() 总是从执行开始时的同一点初始化其伪随机序列。

在使用rand() 之前,您必须输入一个真正随机的种子才能获得不同的值。这可以通过函数srand 来完成,该函数将根据传递的种子改变序列。

尝试:

srand(clock());   /* seconds since program start */
srand(time(NULL));   /* seconds since 1 Jan 1970 */

【讨论】:

    【解决方案2】:

    你必须播种rand()

    srand ( time(NULL) ); 通常用于初始化随机种子。否则,

    【讨论】:

      【解决方案3】:

      在调用 rand() 之前,您需要一个种子。尝试拨打“srand (time (NULL))

      【讨论】:

        【解决方案4】:

        您必须首先使用 srand() 初始化随机种子。

        #include "stdafx.h"
        #include "stdio.h"
        #include "conio.h"
        #include "stdlib.h"
        
        int main(void)
        {
            srand(time(NULL)); // Initialise the random seed.
            printf("%d", rand());
            return 0;
        }
        

        【讨论】:

          【解决方案5】:

          rand() 给出一个随机值,但您需要先播种它。问题是如果你多次执行代码(可能),使用相同的种子srand(time(NULL)),然后rand();将始终给出相同的值。

          然后,第二个选项是执行,正如 Thiruvalluvar 所说,srand(time(NULL)),然后是 rand()

          上面的一个会给你1000个随机数。尝试执行这段代码,看看会发生什么:

          srand (time(NULL));
          for (int i=0; i<1000; i++)
              {
              printf ("Random number: %d\n", rand());
              }
          

          希望对你有帮助!

          【讨论】:

          • 第一个想法很糟糕。不断地为生成器播种既是不必要的,而且很可能会导致一个糟糕的序列。第二个实际上是正确的,并且不会每次都产生相同的随机数。
          • @Clifford 不仅是一个糟糕的序列,而且是一个可预测的序列。在前 5 或 6 个值出来后,您可以从技术上找到播种模式,并预测接下来的 990 个种子/值。
          • 完全正确,对造成的误解深表歉意,我无法对其进行测试,只是从头顶写了出来。现在我对其进行了测试并更正了我的答案,但我不能做出比以前的答案更多的贡献。
          • 谢谢@PaulP.R.O.,下次我会正确测试我的代码
          猜你喜欢
          • 2010-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-25
          • 2022-01-17
          • 1970-01-01
          • 2014-08-26
          • 1970-01-01
          相关资源
          最近更新 更多