精華區beta NTUE-CS99 關於我們 聯絡資訊
亂數的運作 亂數(random number)是指隨機產生的數字。隨機也就是指每個數字出現的機率 都是一樣的,所以我們可以利用亂數來模擬投硬幣、骰子或是發撲克牌、樂透 等等。以投硬幣來說,我們可以讓電腦產生0或1的亂數,分別代表硬幣正反面 當然電腦不可能真的去投硬幣,電腦是利用統計原理產生出來的亂數表來產生 亂數。有了亂數表,就可以產生亂數了。但是,如果程式沒有更換亂數表,每 次執行程式的時候,都會使用預設的那張亂數表,導致每次的結果都一樣,降 就不叫亂數了,所以在程式的一開始,需要每次都找一張不同的亂數表,通常 我們會用時間當作種子,因為每次執行程式的時間都不一樣( 排除每次執行程 式都把時間調成一樣這種搗蛋的情況 ),所以就可以拿到每次執行都不一樣的 亂數囉。 C++裡面,亂數產生器會產生int範圍的整數,也就是說,3287898 類似這樣的東西 可是我們需要的可能只是1~6或者0,1,那要怎麼辦呢? 先假設亂數的範圍是1~100 要產生0,1的亂數 有很多方法 EX: 把1~50當做0, 51~100當做1 或者 把單數當作0, 雙數當作1 那如果是產生1~6的話 最簡單的方式就是取餘數來切割亂數範圍 rand()%6+1; 把亂數除以六再加一 相當於產生1,2,3,4,5,6的亂數 但如果範圍是1~100,勢必會變成不公平的骰子 因為C++裡面產生的亂數範圍高達2^32,就可以達到統計所說的,骰子投一百萬次 機率會很接近1/6一樣。 PS: 有一個公式大家可以參考一下 產生a到b之間的亂數 (rand()%(b-a+1))+a; EX: 產生1~6 rand()%6+1; 亂數產生器的語法 rand(); 任意產生int範圍( -2^31 ~ (2^31)-1 )內的一個整數,不用傳入值 srand(unsigned int n); 選取第n張亂數表 ( n 又稱種子 必須要是正整數 ) time(time_t*); 傳回現在到格林威治1970/1/1 12:00am的秒差 結合time跟srand : srand((unsigned)time(NULL)); (當做公式背下來) rand 和 srand 需要 #include<stdlib.h> time 需要 #include<time.h> 亂數產生器的用法 舉投銅板的例子 #include<iostream> #include<stdlib.h> #include<time.h> using namespace std; int main(){ srand((unsigned)time(NULL)); //選一張亂數表 int a; a=rand()%2; //產生0,1的亂數 if(a==0){ //0當反面 cout<<"硬幣投出反面"; } else { //1當正面 cout<<"硬幣投出正面"; } }