第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

c語言srand生成隨機(jī)數(shù)的問題

c語言srand生成隨機(jī)數(shù)的問題

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永遠(yuǎn)都相等,對(duì)比書上答案發(fā)現(xiàn)書上生成隨機(jī)數(shù)的函數(shù)是用int creatnum(){ return rand()%10+1;}和我的對(duì)比他沒有在這個(gè)被調(diào)用的函數(shù)里面用srand,請(qǐng)問為什么我生成的a和b是一樣的呢,srand放不放在函數(shù)里悠悠什么區(qū)別呢?
查看完整描述

1 回答

已采納
?
這都不會(huì)

TA貢獻(xiàn)72條經(jīng)驗(yàn) 獲得超92個(gè)贊

srand是初始化種子。你這個(gè)問題我們不得不談到rand函數(shù)的實(shí)現(xiàn)。

我們來看看概念性的代碼

static?unsigned?long?next?=?1;/*?如果你不?srand,那種子就默認(rèn)為1?*/

int?rand(void)?{
????next?=?next?*?1103515245?+?12345;
????return((unsigned)(next/65536)?%?32768);
}
????
void?srand(unsigned?seed)?{
????next?=?seed;
}

真正的這倆函數(shù)的實(shí)現(xiàn)比這個(gè)復(fù)雜多了,但是原理是一樣的。

其實(shí)rand函數(shù)就是種子經(jīng)過一系列計(jì)算后取余,更新種子,并返回取余后的這個(gè)值。

那么,更新種子初始化種子有何不同呢?

初始化種子是給種子一個(gè)固定值。

我們可以清楚的知道,rand每次運(yùn)行后是自己更新種子的,經(jīng)過一系列數(shù)學(xué)原理的運(yùn)算取余等,導(dǎo)致了每次的返回值不相同,造成了隨機(jī)數(shù)的現(xiàn)象。

但是如果這樣會(huì)怎么樣?

srand(2);
a?=?rand();
srand(2);
b?=?rand();

a和b會(huì)相等!

原因在于生成a后種子值本來被rand更新了,但又被srand(2)設(shè)置為了2!

因?yàn)閮H僅是數(shù)學(xué)運(yùn)算,當(dāng)種子相同,即都為2時(shí),返回值是相同的。所以兩次生成的隨機(jī)數(shù)才相同。

明白了這個(gè),我們返回來看看你這個(gè)問題。

其實(shí)你也是同理的,你在函數(shù)里這么寫

int?creatnum()
{
srand(time(NULL));
return?rand()%10+1;
}

調(diào)用的時(shí)候

a?=?creatnum();
b?=?creatnum();

實(shí)際上就是

srand(time(NULL));
a?=?rand()%10+1;
srand(time(NULL));
b?=?rand()%10+1;

可以看出,雖然是時(shí)間作種子,但是由于計(jì)算機(jī)運(yùn)行速度太快了,在一秒之內(nèi)就執(zhí)行完了你這四句代碼,所以time(NULL)產(chǎn)生的秒數(shù)是相同的!

這就發(fā)生了上面那個(gè)問題。

但是如果你函數(shù)不寫srand(time(NULL));而寫在主函數(shù)里,看起來就像是

srand(time(NULL));
a?=?rand()%10+1;
b?=?rand()%10+1;

生成a后種子值被rand更新了。當(dāng)然就和b不一樣了。

不懂再問。

查看完整回答
4 反對(duì) 回復(fù) 2016-11-17
  • 1 回答
  • 0 關(guān)注
  • 2164 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)