在公司我们午饭通过点外卖来解决,点餐付款由张老板负责了,但是留下一个问题,饭后的餐桌整理由谁负责,且并不是每个人每天都点外卖,所以不能做一个值日表让固定的人擦桌子。今天中午临时决定写一个简单的GUI程序生成3个随机数,由此来确定哪个luckyboy来擦桌子(~ ̄▽ ̄)~ 。所以每一个中午点外卖的人都有擦桌子的风险( ̄. ̄)。
解决思路:调用 C/C++库函数random()
函数返回一个0~num-1之间的随机数. random(num)是在stdlib.h
中的一个宏定义. num和函数返回值都是整型数.
srand((int)time(0));
num = random(NumMax);
random()的返还值是一个随机值,但是如果不经过srand()
函数随机数发生器的初始化,再次取随机数会得到相同的随机值,这个值不会改变。
使用到的控件
判断成员是否点餐,用QT的控件【Check Box】,连接到槽clicked(bool)
。如果控件传入的值为真,判断成员点餐有效,将值存入数组。
void MainWindow::on_checkBox_clicked(bool checked)
{
if (checked)
chCheckBox[0] = 1;
else
chCheckBox[0] = 0;
}
输出信息,使用控件【textBrowser】,在使用QT输出字符串或者数字是QString,需要将文本转换为QString
类型。
QString QStrNum;
QStrNum = QString::number(OrderFoodNum,10);//将OrderFoodNum按10进制转为QString
ui->textBrowser->setText(QStrNum);
解决点餐人数不确定问题
虽然每天点餐的人数是不固定的,但是通过点餐群我们知道可能点餐的总人数,我们默认全部的人都是点餐的,按照这个人数,生成三个随机数。但是事实上并不是全部的人都会点餐,所以在生成随机数后,检查这个随机数对应的人是否勾选点餐,如果没有,放弃这个随机数,产生下一个随机数,直到所有随机数都勾选了点餐。
rand函数
- 头文件
<stdlib.h>
- 定义函数:int rand(void)
- 函数功能:产生随机数
- 函数说明:因为rand的内部是用线性同余法做的,不是真的随机数,只不过因为其周期特别长,所以在一定范围内可以看成是随机的,rand()会返回一随机值,范围在0到RAND_MAX间,在调用此函数产生随机数前,必须利用srand()设好随机数种子,若没有设随机数种子,rand()在调用时会自动设随机数种子为1。
- 返回值:返回0到RAND_MAX之间的整数值,RAND_MAX的范围最少在32767之间(int),即双字节(16位)。若unsigned int双字节是65535,且0-RAND_MAX每个数字被选中的随机率是相同的。 rand()产生的是假随机数,每次执行时是相同的,若要不同以不同的值来初始化,初始化的函数就是srand()。
srand函数
- 头文件
- 定义函数:void srand(unsigned int seed);
- 函数声明:srand()用来设置rand()产生随机数时的随机数种子,参数seed必须是整数,通常可以用time(0)的返回值作为seed.如果每次seed都设置相同的值,rand()产生的随机数值每次都一样。
- srand(unsigned)time(NULL))使用系统定时/计数器的值作为随机种子每个种子对应一组根据算法预先生成的随机数,所以在相同平台的环境下,不同时间产生的随机数是不同的,相应的若将srand(unsigned)tima(NULL)改为任一常量,则无论何时运行,运行多少次得到的随机数都是一组特定的序列,所以srand生成的随机数是伪随机数。但是,所谓的“伪随机数”指的并不是假的随机数,其实绝对的对技术只是一种假想状态的随机数,计算机只能生成相对的随机数,而这些随机数既是随机的又是有规律的,一部分遵守一定规律,一部分则不遵守任何规律,总结来说就是:计算机产生伪随机数而不是绝对的随机数。
srand((int)time(NULL));//随机种子 num2 = random(OrderFoodNumMax); while(((0==chCheckBox[num2]))||(num2 == num1 || num2 == num0)) { num2 = random(OrderFoodNumMax); }
srand放在循环里面,每产生一个随机数之前,都调用srand,由于计算机运行很快,这段代码总共执行不到1s,而srand()返回是以秒为单位,所以每次用time得到时间都是一样的,这相当于使用同一个种子产生产生随机序列,所以每次产生的随机数相同,于是出现所有Num2是一样的,所以应该把srand放在循环外面。