C語言讓電腦跑亂數
今天我們來讓電腦跑亂數吧~
可是你會說:「電腦不是只會跑固定的指令嗎?」
話是沒錯,但是只要有技巧,也是能做到的!
由於這次要介紹的東西,不需要什麼邏輯,只是有些「江湖一點訣,說破不值錢」的手法。所以這次就以情境式的寫法,帶大家一步一步看透這個玩意吧~
rand()函式
首先取得一個亂數要使用rand()函式(定義在stdlib.h函式庫裡),這函式會把一個稱為「亂數種子」的數字,經過一串加減乘除後,運算(產生)出一個亂數,並且把亂數種子改掉,那一串加減乘除是固定的,是什麼不重要,畢竟你要產生的是亂數XD。
好了我們先來試試看,讓我們輸出5個亂數吧~所以我們輸入的下面的程式碼。
#include<stdio.h> #include<stdlib.h> int main() { int a,b; for(a=1;a<=5;a++) { b= rand(); printf("%dn",b); } system("pause"); return 0; } |
YA!亂數做出來啦︿︿,但是你有沒有發現每次執行,五個數都一樣!!如下圖
這是因為系統在設置亂數種子時,每次都會設成同樣的數值,所以經過固定的運算,得到的數值就會相同。
srand()函式
現在讓我介紹另一個函式:srand()(定義在stdlib.h函式庫裡),這個函式可以改變亂數種子,讓我們的亂數不會每次都一樣。這個函式需要輸入一個數字。
讓我們再來試一次吧~我參數輸入100做例子。
#include<stdio.h> #include<stdlib.h> int main() { int a,b; srand(100); //我參數輸入100做例子 for(a=1;a<=5;a++) { b= rand(); printf("%dn",b); } system("pause"); return 0; } |
哇~跟亂數上次不一樣了,但再試了五次,怎麼每次都執行還是一樣=。=,這是因為你雖然把亂數種子換掉,但這個種子還是一個定數,所以當然還是一樣。
time(NULL)函式
那我們來想想,什麼數值是非定數?其中一種就是時間啦!現在我在介紹一個函式time()(定義在time.h函式庫裡),這個函式也需要輸入一個參數,這個參數有一定的格式,有興趣自己上網查XD,在這裡參數輸入NULL 就可以了,意思是不需要修改。time(NULL)會輸出從格林威治時間 1970年1月1號 0點0分0秒開始到現在的秒數,
現在再來試一次吧~
#include<stdio.h> #include<stdlib.h> #include<time.h> //不要忘記這行喔 int main() { int a,b; srand(time(NULL)); for(a=1;a<=5;a++) { b=rand(); printf("%dn",b); } system("pause"); return 0; } |
嘿嘿,這下每次得亂數都不同了吧!成功~
控制範圍
接下來又有個問題了,他的亂數忽大忽小,要怎麼控制範圍勒?很簡單,使用MOD(取餘數運算子)。
小幫手:
MOD(取餘數運算子),在C語言哩,是用%符號,舉個例子。
7%3,意思是7除以3的餘數,所以答案是1。
假設我們想要的範圍是0~99,
那我們可以這樣寫rand()%100;
不管數字是怎樣,經過這個運算,就一定會在0~99以內。
再假設我們想要的範圍是1~100,
那我們可以這樣寫rand()%100+1;
不管數字是怎樣,經過這個運算,就一定會在1~100以內。
又假設我們想要的範圍是5~105,
那我們可以這樣寫rand()%(100+1)+5;
不管數字是怎樣,經過這個運算,就一定會在5~105以內。
所以整理起來可以變成以下的規則: ( rand() % (最大值-最小值+1) ) + 最小值。
愚蠢的提醒
這樣大家都會了吧~在結束之前,最後提醒大家,不需要再每個需要取得亂數的前面都加上srand(time(NULL))。因為你每取得一個亂數,rand()把亂數種子改掉之後,你又用srand(time(NULL))把它修改,然後電腦跑指令是很快的,取下一個亂數之前,可能連一秒都還沒過呢!這樣每次取得的亂數當然就會一樣啦。
另外,srand()的參數也可以是其他非定數的數值,像是CPU的使用率、記憶體使用量…等,反正由你去發現了喔︿︿
(之所以會這麼提醒,是因為…我自己之前做過這樣的蠢事=。=)