srand()如何工作?

时间:2015-10-21 02:54:24

标签: c random srand

这是我的代码:

#include<stdio.h>
#include<stdlib.h>
#include <time.h>
int main(){
float m, n;
printf("Enter n, m:");
scanf("%f %f", &n, &m);
int l;
l=m-n;
int i;
for(i=0; i<4; i++){
    srand(time(NULL));
    double r=rand();
    r/=RAND_MAX;
    r*=l;
    r+=n;
    printf("%f ", r);
}
return 0;
}

为什么它生成相同的数字?当我在循环之前写srand(time(NULL));时,会产生不同的数字!为什么会这样?该计划如何运作?

2 个答案:

答案 0 :(得分:5)

srand() 种子随机数序列。

  

srand函数使用该参数作为后续调用rand返回的新伪随机数序列的种子。 如果使用相同的种子值调用srand,则应重复伪随机数序列。 ...C11dr§7.22.2.22

time()通常是相同的值 - 对于第二个@kaylum

[编辑]

最好只在代码中提前一次致电srand()

int main(void) {
  srand((unsigned) time(NULL));
  ...

或者,如果您每次都想要相同的序列,请不要再调用srand() - 对调试很有用。

int main(void) {
  // If code is not debugging, then seed the random number generator.
  #ifdef NDEBUG
    srand((unsigned) time(NULL));
  #endif
  ...

答案 1 :(得分:1)

time(NULL)的调用返回当前日历时间(自1970年1月1日以来的秒数)。 所以你给的是同样的种子。所以,兰德给出了相同的价值。

您可以使用:

 srand (time(NULL)+i);