假如我們要給小朋友出100以內減法題,而且我們希望每次運行的減法都不一樣(不能永遠是9-2=?),那么我們該怎么辦呢?
這里我們需要用到隨機數,每次出的題中,減數與被減數是兩個隨機數,這樣就可以避免只做一道題。
隨機數要用頭文件<cstdlib>中的rand()函數來生成,生成的隨機數在0~RAND_MAX之間,RAND_MAX是由平台決定的。
看下面一段代碼:
1 #include <iostream> 2 #include<cstdlib> 3 4 using namespace std; 5 6 int main() 7 { 8 int rad=rand(); 9 cout << rad; 10 return 0; 11 }
我運行的結果是41(不同機器運行結果不同)。我們再嘗試着運行一次,會發現出現的結果還是41(和上次一樣),這是因為rand()函數生成的是偽隨機數。
rand()算法中有一個叫做種子(seed)的值,它的默認值為1,如果我們不去改變它,那么生成的偽隨機數都是一樣的。
為了使得種子在每一次運行時都不同,我們需要用到<ctime>頭文件中的time(0)函數,該函數返回自格林尼治時間(1970年1月1日00:00:00)到現在的秒數,因為運行的時間一定是不同的,所以seed也是不同的,這樣的rand()才是真正的隨機數。代碼如下:
1 #include <iostream> 2 #include<cstdlib> 3 #include<ctime> 4 5 using namespace std; 6 7 int main() 8 { 9 srand(time(0));//修改seed 10 int rad=rand(); 11 cout << rad; 12 return 0; 13 }
回到最開始的問題,現在我們要有兩個小於100的隨機數,並且num1大於num2,之后通過if分支語句判斷答案的正確性:
1 #include <iostream> 2 #include<cstdlib> 3 #include<ctime> 4 5 using namespace std; 6 7 int main() 8 { 9 srand(time(0));//改變種子的值 10 int num1=rand()%100; 11 int num2=rand()%100; 12 //生成兩個100以內的隨機數 13 if(num1<num2) 14 { 15 num1 = num1 + num2; 16 num2 = num1 - num2; 17 num1 = num1 - num2; 18 }//如果num1小,交換num1和num2 19 20 cout << "What's " << num1 << " - " << num2 << "? " << endl; 21 22 int answer = 0; 23 cin >> answer; 24 25 if(num1-num2==answer) 26 { 27 cout << "Great! You are right! " << endl; 28 } 29 else 30 { 31 cout << "Sorry! You are wrong! " << endl << num1 << " - " << num2 << " should be " << num1-num2 << "! " << endl; 32 } 33 return 0; 34 }
兩次運行結果如下:
如果要表示20~29的隨機數怎么辦?
1 #include <iostream> 2 #include<cstdlib> 3 #include<ctime> 4 5 using namespace std; 6 7 int main() 8 { 9 srand(time(0));//改變種子的值 10 int num=20+rand()%10; 11 //先生成0~9的隨機數,再加20,就可以表示20~~29的隨機數了 12 13 cout << num; 14 return 0; 15 }