猿问

c语言srand生成随机数的问题

#include<stdio.h>

#include<stdlib.h>

#include<time.h> 

int creatnum();

int creatsys(int a,char op,int b);

int creatop();

int isright(int sys,int use);

int main()

{

int a,b,sys,use,count=0;char op;

for(int i=0;i<10;i++)

{

srand(time(NULL));

a=creatnum();

b=creatnum();

op=creatop();

sys=creatsys(a,op,b);

printf("%d%c%d=?:",a,op,b);

scanf("%d",&use);

if(isright(sys,use))

{

printf("right\n");

count++;

}

else

printf("wrong\n");

}

printf("corret rate is%d%%",10*count);

return 0;

}


int creatnum()

{

srand(time(NULL));

return rand()%10+1;

}


int creatsys(int a,char op,int b)

{

switch(op)

{

case '+':return a+b;break;

case '-':return a-b;break;

case '*':return a*b;break;

case '/':return a/b;break;

}

}


int creatop()

{

srand(time(NULL));

char op=rand()%4+1;

switch(op)

{

case 1:op='+';break;

case 2:op='-';break;

case 3:op='*';break;

case 4:op='/';break;

}

return op;

}


int isright(int sys,int use)

{

int flag;

if(sys==use) 

flag=1;

return flag;

}

但是生成的a和b永远都相等,对比书上答案发现书上生成随机数的函数是用

int creatnum()

{

return rand()%10+1;

}

和我的对比他没有在这个被调用的函数里面用srand,请问为什么我生成的a和b是一样的呢,srand放不放在函数里悠悠什么区别呢?

Leo也叫做夹子
浏览 2110回答 1
1回答

这都不会

srand是初始化种子。你这个问题我们不得不谈到rand函数的实现。我们来看看概念性的代码static unsigned long next = 1;/* 如果你不 srand,那种子就默认为1 */ int rand(void) {     next = next * 1103515245 + 12345;     return((unsigned)(next/65536) % 32768); }      void srand(unsigned seed) {     next = seed; }真正的这俩函数的实现比这个复杂多了,但是原理是一样的。其实rand函数就是种子经过一系列计算后取余,更新种子,并返回取余后的这个值。那么,更新种子和初始化种子有何不同呢?初始化种子是给种子一个固定值。我们可以清楚的知道,rand每次运行后是自己更新种子的,经过一系列数学原理的运算取余等,导致了每次的返回值不相同,造成了随机数的现象。但是如果这样会怎么样?srand(2); a = rand(); srand(2); b = rand();a和b会相等!原因在于生成a后种子值本来被rand更新了,但又被srand(2)设置为了2!因为仅仅是数学运算,当种子相同,即都为2时,返回值是相同的。所以两次生成的随机数才相同。明白了这个,我们返回来看看你这个问题。其实你也是同理的,你在函数里这么写int creatnum() { srand(time(NULL)); return rand()%10+1; }调用的时候a = creatnum(); b = creatnum();实际上就是srand(time(NULL)); a = rand()%10+1; srand(time(NULL)); b = rand()%10+1;可以看出,虽然是时间作种子,但是由于计算机运行速度太快了,在一秒之内就执行完了你这四句代码,所以time(NULL)产生的秒数是相同的!这就发生了上面那个问题。但是如果你函数不写srand(time(NULL));而写在主函数里,看起来就像是srand(time(NULL)); a = rand()%10+1; b = rand()%10+1;生成a后种子值被rand更新了。当然就和b不一样了。不懂再问。
随时随地看视频慕课网APP
我要回答