C编程中的rand()问题?

C编程中的rand()问题?,c,random,compilation,C,Random,Compilation,可能重复: 所以,是的,这似乎有点不切实际,但自从我在Java变得通情达理后开始自学C,我已经遇到了一些麻烦。我试图在C中使用rand()函数,但我只能调用它一次,当它调用时,它总是生成相同的随机数,即41。我使用微软Visual C++ 2010 Express,我已经设置它,所以它将编译C代码,但唯一不工作的是这个RAND()函数。我尝试过包括一些常用的库,但没有任何效果。代码如下: #include "stdafx.h" #include "stdio.h" #include "coni

可能重复:

所以,是的,这似乎有点不切实际,但自从我在Java变得通情达理后开始自学C,我已经遇到了一些麻烦。我试图在C中使用rand()函数,但我只能调用它一次,当它调用时,它总是生成相同的随机数,即41。我使用微软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(时间(空))通常用于初始化随机种子。否则,在调用rand()之前需要一个种子。尝试调用“
srand(time(NULL))

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

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

尝试:

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

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

rand()。问题是,如果您使用相同的种子
srand(time(NULL))
多次(可能)执行代码,那么
rand()
;将始终给出相同的值

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

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

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

对于(int i=0;i“出于某种原因”?没有错误消息?我发现…不太可能。当说某事“不起作用”时,尝试包括实际发生的情况。在这种情况下,这很容易,但问一个完整的问题只是常识和礼貌。我使用它一次时不会收到错误消息,但当我将它放入循环时会收到错误消息。这就是为什么我说“出于某种原因”。别忘了真正的随机性并不存在;它始终是伪随机性,在每次运行时生成相同的伪随机序列是一项功能。很可能,在您的情况下没有用处,但我相信值得知道。请注意,
rand()的能力
生成可重复/确定的序列是有意的,有时也很有用
或者使用常量值调用它,每次的顺序都是相同的,这对于测试/调试很有用,因为您可能不希望每次测试的行为都不同。如果调用
time()
别忘了
#包括
,否则编译器将采用不同的原型并调用未定义的行为。第一种想法是错误的。不断地对生成器进行种子设定是不必要的,而且很有可能会导致错误的序列。第二种想法实际上是正确的,不会产生相同的随机数Y时间。@Clifford不仅顺序不好,而且是可预测的。在前5或6个值出现后,你可以从技术上找到种子模式,并预测接下来的990个种子/值。完全是事实,很抱歉误解,我无法测试它,只是从头开始写。现在我测试并更正了我的答案,但我不能比前面的答案贡献更多。谢谢@PaulP.R.O.,下次我会正确测试我的代码
srand (time(NULL));
for (int i=0; i<1000; i++)
    {
    printf ("Random number: %d\n", rand());
    }