假如我们要给小朋友出100以内减法题,而且我们希望每次运行的减法都不一样(不能永远是9-2=?),那么我们该怎么办呢? 这里我们需要用到随机数,每次出的题中,减数与被减数是
假如我们要给小朋友出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 }
两次运行结果如下:
PS:如果要表示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 }