前言 (随机数和随机种子)
1.随机数
- rand()
如同字面意思,生成随机数
rand() 产生一个0到0x7ffff,即0到32767之间的随机数
- RAND_MAX:表示最大随机数,简而言之就是RAND_MAX==0x7ffff
这个随机数生成了10个,运行了两次,可以看出,两次结果都不变化,(多少次都不变化)
- srand()
随机数种子
通常用srand((unsigned)time(0))或者srand((unsigned)time(NULL))
srand()一定要放在循环外面或者是循环调用的外面,否则的话得到的是相同的随机数。
1.srand((unsigned)time(0))
可以看出加入随机种子后每次运行完的序列不一样,体现了“随机性”。
2.srand((unsigned)time(NULL))
-
1.要取得 [a,b) 的随机整数,使用(rand() % (b-a))+ a (结果值含a不含b)。
-
2.要取得 [a,b] 的随机整数,使用(rand() % (b-a+1))+ a (结果值含a和b)。
-
3.要取得 (a,b] 的随机整数,使用(rand() % (b-a))+ a + 1 (结果值不含a含b)。
可以看出随机数种子的意义就是让随机数每一轮产生不一样的数。
-
重要点
1.{0,1} 随机数(或0;或1) -
a: rand()%2;
-
b: rand*2/RAND_MAX
产生[a,b]上的随机数 ((double)rand()/RAND_MAX)*(b-a) + a ,其中(double)rand()/RAND_MAX)可以得到一个0~1的随机数
1.rand()/RAND_MAX可表示为在[0,1]区间内的随机数
2.rand()/(RAND_MAX+1)可表示为在[0,1)区间内的随机数
猜硬币游戏
1.功能:
a.提供游戏指南
b.计算机随机产生正反面,让用户猜,报告对错结果
c.重复玩游戏过程,直到用户不想玩了为止
2.问题求解
进行结构化程序设计
自顶向下分解为(1)介绍指南;(2)猜结果
即两个函数
void prn_instruction(); 介绍
void play(); 猜结果
- prn_instruction()
void prn_instruction()
{
cout << "这是一个猜硬币正反面的游戏.\n";
cout << "我会扔一个硬币,你来猜.\n";
cout << "如果猜对了,你赢,否则我赢。\n";
}
- play()
void play()
{
char flag = ‘y’;
while ( flag == ‘Y’ || flag == ‘y’)
{
coin = 生成正反面;
输入用户的猜测;
if (用户猜测 == coin)
报告本次猜测结果正确;
else
报告本次猜测结果错误;
询问是否继续游戏
}
}
这里有三个问题:
(1)系统如何生成正反面,使计算机表达后“用户理解”;
(2)用户如何输入猜测,与系统一一对应;
(3)怎么判断游戏继续还是结束
- 问题1:系统如何生成正反面,使计算机表达后“用户理解”
因为计算机只能生成数字,可以使用“1”和“0”表示正反面。所以这里就是使用某种方法使计算机生成数字。
因此使用随机数【1】和【0】
rand*2/RAND_MAX 生成0和1;
srand(time(NULL));
coin = rand() * 2 / RAND_MAX;
- 问题2:用户如何输入猜测,与系统一一对应
这里要保证用户只能输入0和1,无法输入其他的数字。
因此需要使用get_call_from_user(),表示整数型,所以shi
该函数接收用户输入的一个整型数。如果输入的数不是0或1,则重新输入,否则返回输入的值
int get_call_from_user()
{
int guess;
do
{
cout << "\n输入你的选择(0表示正面,1表示反面):";
cin >> guess;
} while (guess != 0 && guess != 1);
return guess;
}
- 问题3:怎么判断游戏继续还是结束
falg=y或Y