目錄
背景
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
#include void 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的參數,但是我們不可能將年月日直接寫進去吧。
這里我們了解一個概念叫時間戳。
時間戳time()簡單理解,計算機會把時間轉換為一串數字進行存儲,這串數字就叫時間戳(單位秒)。每
個不同的時間都對應一個時間戳,每個時間戳也只對應一個時間。
因此我們把時間戳作為srand的參數即可,而獲取時間戳,我們又得用到另外一個函數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)新互聯