#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放不放在函数里悠悠什么区别呢?
1 回答
已采纳
这都不会
TA贡献72条经验 获得超92个赞
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不一样了。
不懂再问。
- 1 回答
- 0 关注
- 2109 浏览
添加回答
举报
0/150
提交
取消