在學習C語言過程中,有的時候我們需要隨機生成一些數字,不按照我們人為的意識隨機生成,就需要借助C語言的兩個函數幫我們實現,就是rand和srand函數,使用這個兩個函數需要首先包含頭文件<stdlib.h>,下面給大家展示使用方法
首先是rand函數,它的作用就是生成一個0~RAND_MAX之間一個數字,RAND_MAX和EOF本質一樣是一個宏定義,不同編譯器定義的大小不一樣,如有的編譯器表示十六進制 0x7fff(對應十進制為32767),如下圖:
rand函數的原型也很簡單:int rand(void); 即不需要傳參直接使用即可通過返回值的方式生成,我們可以簡單敲出完整代碼,如下:
#include <stdio.h> #include <stdlib.h> int main() { int a = rand(); printf("%d\n",a); return 0; }
大家可以自行上機運行試驗,但是呢,不管打印出來的數字是多少,大家多運行幾次就會發(fā)現,好像每次運行的出來的數值都一樣!其實rand函數每次隨機出來的數字其實與所謂的“種子”有關,rand函數生成隨機數其實并非真正意義上的隨機,即真正我們理解的像“用手隨機拋硬幣”的隨機,這個函數當然是模擬隨機的效果,是按照一定的“公式”實現出來的,這個“公式”中的變量即前面提到的種子,在前面的例子中,我們并沒有用到“種子”,那么系統會自動給1,因此你會得到每次都是一樣的隨機值。所以要想改變這一問題,將需要用第二個函數srand來幫我們種種子,來達到每次不一樣的效果。
srand的函數的原型為:void srand(unsigned seed); 即需要傳入一個無符號整形的數值,比較聰明的做法呢就是傳入系統時間,通過time函數(需要加time.h的頭文件)獲取時間然后傳入,這樣每次種子都不一樣,因此rand得到的隨機數也將不同,所以呢就有了這樣的寫法:
srand((unsigned)time(NULL));
因此,我們只要在用rand函數生成隨機數之前,先執(zhí)行srand函數即可,完整代碼如下:
#include<stdio.h> #include<stdlib.h> #include<time.h> int main() { int r=0; int i=0; srand((unsigned)time(NULL)); while(i++<10) { printf("r = %d\n",rand()); } return 0; }
大家可以上機運行觀察,每次得到的數字就不同了,請大家親自上機實驗。
C語言網提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習題和答疑,點擊了解:
一點編程也不會寫的:零基礎C語言學練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學奧賽或C++選手的 必學C++課程
藍橋杯ACM、信息學奧賽的必學課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導課程