目錄
1.rand和srand介紹
2.如何使用rand和srand
3.常見到的問題
4.用C語言實作猜數字游戲
1.rand和srand介紹
在C語言中,當我們需要產生偽亂數的時候,我們往往會使用rand()和srand()兩個函式,他們是一對相輔相成的函式,在MSDN中搜索rand函式,你會看到如下圖所示的內容:

使用rand函式能夠生成亂數,但這個數并非完全隨機,而是偽亂數,
- 在使用之前我們需要引一個名為stdlib的庫函式,
- 在呼叫之后,rand函式將會回傳一個范圍為0到rand_MAX的偽隨機整數,因此rand不會產生錯誤回傳,
int rand( void )告訴我們,rand函式無需傳參,
- 但在呼叫rand之前,需要我們使用srand函式為偽亂數生成器設定種子(seed),
因此srand()的作用便是為rand()設定種子,種子的作用我們會在第二點講到,
2.如何使用rand和srand
由于rand函式無需傳參,呼叫起來也比較方便,因此如果你想生成亂數并且列印在螢屏上,只需要寫上這么一行代碼就可以了
#include<stdio.h>
#include<stdlib.h>
int main()
{
int ret = rand(); //使用ret接受一個回傳值
printf("%d\n", ret); //將rand()的回傳值列印出來
return 0;
}
運行得到的結果如下,我們這里使用rand函式回傳了一個41的隨機值,

但是當我們再次運行程式時,發現所產生的亂數仍然時41,這明顯與我們想要輸出的所謂“亂數不同”,究其原因:
rand 是一個固定的迭代函式,輸出亂數的原理是對一個初始值不停嵌套計算后進行輸出,輸出的序列有不錯的統計性質,所以叫偽亂數, 然而,在不進行設定時,這個初始值始不會發生改變,這意味著每次得到的結果都是一樣的,srand就是對這個初始值進行設定的一個函式,
srand()為初始化亂數發生器,需要在rand()之前呼叫,
其引數稱作“種子seed”,型別是unsigned int,作用于rand()產生亂數時的程序,當我們給的引數為1時,下面代碼得到的結果是41,和之前的結果一致,說明在沒有呼叫srand之前,編譯器默認給了一個srand(1),



在改變seed的值后,可以看到rand產生的亂數發生了變化,這進一步印證了 rand產生的亂數是借于srand的seed不斷改變而實作的,seed的值不變,所產生的亂數也不變,因此不難看出,我們需要一個不斷變化的seed來確保每次rand產生的數是不同的,
這里我們通常使用會使用time(NULL)或time(0)來表示變化的種子,time(0)的回傳的是從1970 UTC Jan 1 00:00到當前時刻的秒數,為unsigned int型別,而使用time(NULL),通常需要將其強制型別轉換:
srand((unsigned int)time(NULL));
當我們需要不斷生產亂數時,往往將rand函式放在回圈中,但結果往往出乎我們意料,
使用下面這段代碼我們回圈列印了15個亂數

可這樣一段代碼所得到的所有亂數居然是相同的!
其原因是:
- 當把srand放在回圈體內部時,每一次進入回圈的時間是小于1s的,這樣每次都為srand都提供了相同的seed,這樣不斷地重置一個相同地seed,等價于使用了一個固定的亂數seed,
正確地做法是將srand()放在回圈外部:

因此,rand()和srand()的標準用法是:
- 給srand一個不斷變化的引數,通常用時間戳
- 將srand放在回圈外部
- 將rand放在回圈內部
3.常見到的問題
有時我們需要給出在一定范圍內的亂數,可以使用C語言中的求余“%”和除法“/”運算,
例如需要產生[0,1]內的亂數時,可以考慮如下代碼:
rand_num = rand()/RAND_MAX;
需要產生[1,100]的亂數時 ,可以考慮如下代碼:
rand_num= rand()%100+1;
4.用C語言實作猜數字游戲
學習完rand()和srand()之后,我們可以用C語言撰寫一個猜數字的游戲:
//猜數字游戲實作
//1.電腦隨機生成一個1~100之間的數
//2.玩家輸入數字,如果命中,輸出“猜中了”;不命中,輸出“猜大了”或“猜小了”;直至猜中為止
//3.游戲可以一直玩
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu1()
{
printf("*******************\n");
printf("*****1.開始游戲*****\n");
printf("*****0.退出游戲*****\n");
printf("*******************\n");
}
void menu2()
{
printf("*******************\n");
printf("*****1.再來一局*****\n");
printf("*****0.退出游戲*****\n");
printf("*******************\n");
}
void game()
{
int i = rand()%100+1;
//printf("%d\n", i);
while (1)
{
int guess = 0;
scanf("%d", &guess);
if (guess < i)
{
printf("猜小了\n\n");
}
else if (guess > i)
{
printf("猜大了\n\n");
}
else if (guess == i)
{
printf("恭喜你,猜對了!\n\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
int flag = 0;
do
{
flag++;
if(flag==1)
{
menu1();
}
else
{
menu2();
}
printf("請選擇:>");
scanf("%d", &input);
switch (input)
{
case 0:
printf("退出游戲\n");
break;
case 1:
printf("請猜一個數字:>");
game();
break;
default:
printf("輸入錯誤\n");
}
} while (input);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/413999.html
標籤:其他
下一篇:用C語言實作一個小游戲—猜數字
