【C/C++】如何生成隨機數?帶你深入了解rand函數-創(chuàng)新互聯

在湘潭等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統性、市場前瞻性、產品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供成都網站建設、網站制作 網站設計制作定制網站設計,公司網站建設,企業(yè)網站建設,品牌網站建設,成都全網營銷推廣,成都外貿網站制作,湘潭網站建設費用合理。

目錄

背景

rand()

srand()

時間戳

time()

完整源碼?


背景

當我們學習完分支與循環(huán)并了解過一點點函數之后,就可以試著編寫代碼實現一個簡易的猜數字小游戲了。

游戲方法:電腦生成一個1~100的隨機數,玩家進行猜數字,

我們將游戲的實現封裝在game()函數中,而第一步,就是讓電腦生成一個隨機數。

這里我們需要用到一個生成隨機數的庫函數rand。

rand()

看不懂沒關系,我來為大家簡單釋義:

首先是rand函數的構造

int? rand? (void) //函數返回值為int類型,且無需參數

它的功能就是生成0~RAND_MAX(32767)的隨機值。RAND_MAX其實就是32767。

然后使用rand函數之前,別忘了包含它所在的頭文件stdlib.h。

這時我們來測試:

#include#includevoid menu()
{
	printf("*********************************\n");
	printf("**********  1. play  ************\n");
	printf("**********  0. exit  ************\n");
	printf("*********************************\n");
}

//rand函數可以生成隨機數
//返回一個0~RAND_MAX(32767)
void game()
{
	int guess = 0;
	//1. 生成隨機數
	int ret = rand();
	printf("%d\n", ret);
}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("請選擇:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戲\n");
			break;
		default:
			printf("選擇錯誤,重新選擇!\n");
			break;
		}

	} while (input);

我們進行簡單的測試后,發(fā)現一下結果:

隨機數已經成功生成。

我們激動的關掉程序再來運行一次:

重新啟動代碼以后,我們觀察這些數字是否有種似曾相識的感覺?

在不就是上次運行的結果嗎?既然是隨機數,那么完全有相同的可能。那我們不妨再多試幾遍,

會發(fā)現,結果還是一樣的。如果我們只是這樣草率的完成游戲,玩家玩幾次就會覺得無聊了,因為

每次都能猜中,那這是哪里出了問題呢?

請注意:

文檔提示,使用rand函數之前,我們還得調用另外一個函數srand()。

srand()

這是srand函數的構造:

void srand (unsigned int seed);

srand其實是一個隨機數的生成器,當我們給它不同的參數,就能生成不一樣的數字

例如:

我們發(fā)現果真如此。但是只傳一個固定的參數,我們發(fā)現還是不能完成任務,那么我們就能想

到,是不是給它一個一直變化的值就好了呢?確實是這樣。

那么,在計算機中什么是一直變化的呢?答案是:時間。

我們需要將變化的時間作為srand的參數,但是我們不可能將年月日直接寫進去吧。

這里我們了解一個概念叫時間戳。

時間戳

簡單理解,計算機會把時間轉換為一串數字進行存儲,這串數字就叫時間戳(單位秒)。每

個不同的時間都對應一個時間戳,每個時間戳也只對應一個時間。

因此我們把時間戳作為srand的參數即可,而獲取時間戳,我們又得用到另外一個函數time().

time()

函數構造:

time_t? ? time? ? (time_t* timer);

我們發(fā)現time()需要的參數為指針類型的參數,由于目前沒接觸指針,我們只需要將NULL(空指

針)作為參數即可。另外,別忘記包含頭文件time.h。

整理一下:

這是game函數應該這樣寫:

void game()
{
	srand((unsigned int)time(NULL));//srand所需參數為unsigned int類型,這里用到了強制類型轉換
	int guess = 0;
	//1. 生成隨機數
	int ret = rand();
	printf("%d\n", ret);
}

我們再來測試:

這次已經得到我們想要的結果了。但是卻并不完美,因為我們發(fā)現每次生成的隨機數都很相近,其實,當我們手速足夠快時,完全可以達到相同的結果:

這里的原因不難理解,計算機的時間是一秒一秒走的,所以轉換出來的時間戳也是每次差一點。當我們在時間戳變換前多次獲取隨機值那么就會產生相同的結果。

其實,這里錯在我們將srand函數放錯位置了。每次程序運行時,我們只需要設置一次隨機數的起點就夠了,保證與下一局游戲數字不重復就行。

所以我們將srand的調用放置在main函數里,因為一個程序,main函數只會執(zhí)行一次。

到此,我們在以后需要生成隨機數時,只需要這套流程即可。

接下來,我們只需要繼續(xù)完善游戲代碼即可,這里就不做贅述。想了解游戲邏輯的小伙伴可以參照我的上一篇博客手撕三子棋。

完整源碼?
#define _CRT_SECURE_NO_DEPRECATE 1
// 猜數字游戲實現

//電腦隨機生成一個1~100之間的數字
//猜數字
//如果你猜小了,告知猜小了
//如果你猜大了,告知猜大了
//如果你猜對了,告知猜對了

#include#includevoid menu()
{
	printf("*********************************\n");
	printf("**********  1. play  ************\n");
	printf("**********  0. exit  ************\n");
	printf("*********************************\n");
}

//rand函數可以生成隨機數
//返回一個0~RAND_MAX(32767)
void game()
{
	int guess = 0;
	//1. 生成隨機數
	int ret = rand()%100+1;//0~99-->1~100
	//printf("%d\n", ret);
	
	//2. 猜數字
	while (1)
	{
		printf("請猜數字:>");
		scanf("%d", &guess);
		if (guess< ret)
		{
			printf("猜小了\n");
		}
		else if (guess >ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你,猜對了\n");
			break;
		}
	}
}

int main()
{
	int input = 0;
	//設置隨機數的生成器
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("請選擇:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戲\n");
			break;
		default:
			printf("選擇錯誤,重新選擇!\n");
			break;
		}

	} while (input);

	return 0;
}

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧

網頁標題:【C/C++】如何生成隨機數?帶你深入了解rand函數-創(chuàng)新互聯
URL鏈接:http://www.muchs.cn/article24/dhcgce.html

成都網站建設公司_創(chuàng)新互聯,為您提供定制網站、網站設計微信小程序、面包屑導航、App開發(fā)網站營銷

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

手機網站建設