添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

由於這次要介紹的東西,不需要什麼邏輯,只是有些「江湖一點訣,說破不值錢」的手法。所以這次就以情境式的寫法,帶大家一步一步看透這個玩意吧~

rand()函式
首先取得一個亂數要使用rand()函式(定義在stdlib.h函式庫裡),這函式會把一個稱為「亂數種子」的數字,經過一串加減乘除後,運算(產生)出一個亂數,並且把亂數種子改掉,那一串加減乘除是固定的,是什麼不重要,畢竟你要產生的是亂數XD。

好了我們先來試試看,讓我們輸出5個亂數吧~所以我們輸入的下面的程式碼。

#include<stdio.h>
#include<stdlib.h>
int main()
	int a,b;
	for(a=1;a&lt;=5;a++)
		b= rand();
		printf("%dn",b);
	system("pause");
	return 0;

#include<stdio.h> #include<stdlib.h> int main() int a,b; for(a=1;a&lt;=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&lt;=5;a++)
		b= rand();
		printf("%dn",b);
	system("pause");
	return 0;

#include<stdio.h> #include<stdlib.h> int main() int a,b; srand(100); //我參數輸入100做例子 for(a=1;a&lt;=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&lt;=5;a++)
		b=rand();
		printf("%dn",b);
	system("pause");
	return 0;

#include<stdio.h> #include<stdlib.h> #include<time.h> //不要忘記這行喔 int main() int a,b; srand(time(NULL)); for(a=1;a&lt;=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的使用率、記憶體使用量…等,反正由你去發現了喔︿︿
(之所以會這麼提醒,是因為…我自己之前做過這樣的蠢事=。=)

文章分類:C & C++|標籤:, , [Ubuntu]寫C語言程式的好幫手Code::Blocks switch條件敘述的用法 用sizeof傳回變數的位元組大小 C語言社團札記4─基本資料型態 C語言社團札記3─我的第一個程式 高中生程式解題系統(ZeroJudge) 適合所有中學生及初學者的線上評分系統 C++大數乘冪運算!真的是超大數運算! cout控制輸出的小數點位數 Vijos 幫你的程式打分數 用C++顯示電子時鐘吧(現在是:10:10:10 AM) 用C++找出某範圍中的質數 while條件迴圈 for計次迴圈 C++如何開根號及計算冪次 if條件式的用法