亂數的生成:
關于亂數的生成,如果你去百度,你會看到這樣的兩段代碼:
srand((unsigned int)time(NULL));
int ret=rand();
那么亂數到底是如何生成的呢?在編程中有哪些應用呢?接下來我們一起來看一下它產生的原理吧,
在MSDN或網站 www.plusplus.com 中可以看到這個函式的功能和用法:

上圖中紅色方框中的RAND_MAX又是什么呢,這里我們可以在VS中查看它的定義

可以看出它為一個0x7fff(16進制)的數,轉換為10進制也就為32767,所以rand函式可以產生0—32767之間的亂數,代碼示例如下:

可以看到,當用一個回圈來生成5個亂數時,螢屏上就出現了5個不一樣的數字,但細心的你一定會發現,當程式在次運行時,螢屏上仍是原來的5位數字,兩次數字完全相同,這又是為啥?原來在上圖rand函式的定義中藍色方框中說道在使用rand函式之前需要用到srand函式,
接下來看看srand函式的定義:

srand函式的功能是設定一個亂數的起點,且它的引數為一個無符號整型并且無回傳值,下面我們再來測驗一下功能:


我們可以看出來,當srand()中的引數不同時,生成數字也不一樣,所以只有保證srand中的引數一直在變動才能夠保證生成的數字不一樣,才能夠實作亂數的生成,那么怎樣才能保證引數一直為一個變數呢?
這是我們就想到了在電腦上有一個東西是時刻發生變化的,那就是時間,這里就來介紹一個概念,那就是時間戳,
時間戳:當前時間與計算機起始時間的差值,單位是秒,(計算機起始時間:1970-01-01 08:00:00)

每一秒的時間戳都不一樣,所以我們只要將時間戳傳入srand函式即可,這時我們就要用到time函式,因為time函式的回傳值就是時間戳,

可以看出time函式的引數為time_t型的指標,回傳值是time_t型,這里細說一下time_t的定義:


我么可以看到,time_t就是int型被typedef重定義了,實質上仍為int型,而我們也不需要向time中傳入任何指標 ,傳入空指標(NULL)即可 ,形式為
time(NULL),但是srand函式的引數為 unsigned in t型,所以我們就需要將time函式的回傳值強制性轉化會 unsigned int 型,也就是( unsigned int )time( NULL),所以最終代碼為:
int main()
{
int n = 5;
srand((unsigned int)time(NULL));
while (n)
{
int ret = rand();
printf("%d\n", ret);
n--;
}
return 0;
}
這樣每次運行代碼后才會正真意義上產生亂數,
下面就運用產生亂數的功能來撰寫一個猜數字的小游戲吧,
猜數字游戲的步驟:
1.隨機產生一個1-100之間的數字
2.猜數字
3.若猜對了,就恭喜你,游戲結束
4.若猜錯,會提示猜大了還是猜小了,然后繼續猜,直到猜對
代碼實作如下:
#include<stdio.h>
#include<time.h>
void menu()
{
printf("**********************\n");
printf("******* 1.play *******\n");
printf("******* 2.exit *******\n");
printf("**********************\n");
}
void game()
{
int ret = rand() % 100 + 1;//巧妙的運用%運算,得到1-100之間的數
int guss = 0;
while (1)
{
printf("請猜測數字:\n");
scanf("%d", &guss);
if (ret < guss)
{
printf("猜大了\n");
}
else if (ret > guss)
{
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:
printf("游戲開始\n");
game();//游戲函式
break;
case 0:
printf("游戲結束\n");
break;
default:
printf("輸入錯誤,請重新輸入\n");
break;
}
} while (input);
return 0;
}
運行效果

提示:
如何生成規定范圍內的亂數?如上代碼
生成1-100之間的亂數,可寫為: int ret = rand() % 100 + 1
生成兩位的亂數,可寫為:int ret=rand()%90+10
生成三位的亂數:int ret=rand()%900+100
還有其他型別的亂數同上道理,就不做多的闡述了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290372.html
標籤:其他
上一篇:【游戲開發實戰】Unity從零做一個任務系統,人生如夢,畢業大學生走上人生巔峰(含原始碼工程 | 鏈式任務 | 主線支線)
下一篇:opencv輪廓檢測
