为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C C++
Leo也叫做夹子 2016-11-16 22:02:15
#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不一样了。

不懂再问。

查看完整回答
4 反对 回复 2016-11-17
  • 1 回答
  • 0 关注
  • 2109 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信