
生活中有太多的不确定因素从各方各面影响着我们,但也正是因为这样我们的人生更加多彩,具有了更多的可能性。生活的智慧就在于,集中精力改变那些能够改变的,而把那些不能改变的暂时忽略掉。专心打造自己,把自己打造成一个优秀的人,一个有用的人,一个独立的人,比什么都重要。
壹
在程序中设计中经常会需要用到随机数,如在游戏设计中使用随机数字来模拟掷骰子或发牌游戏这样的随机过程,在模拟程序中使用随机数字来决定后续将要发生的一系列操作或人与动物等的行为,在安全系统中使用随机数字来加密敏感数据,在数据分析程序中使用随机数字随机校验数据等等。
在随机数中有真伪之分,真正的随机数是使用物理现象产生的,比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等等,这样的随机数发生器叫做物理性随机数发生器,其结果是不可预测的,是不可见的。
而计算机中的随机函数是按照一定算法模拟产生的,其结果是确定的,是可见的,是根据一个数(我们可以称它为种子)为基准以某个递推公式推算出来的一系列数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数。
只要给定一个初始的种子,产生的随机数序列是完全一样的,我们可以这样认为这个可预见的结果其出现的概率是100%,所以用计算机随机函数所产生的“随机数”并不随机,是伪随机数。
所以,要在每次运行程序时获得不同的随机数,则必须为随机数生成器提供一个新的种子以开始。
贰
大部分语言都有随机数生成器的函数,比如C/C++就有个最简单随机函数:rand,它内部实现是用线性同余法做的,返回一随机数值的范围在0至RAND_MAX 间,RAND_MAX的范围最少是在32767之间(int),因其周期特别长,故在一定的范围里可看成是随机的。
所在的头文件:#include <cstdlib> // 标准库
用法实例:
randomNum = rand();
假如我们直接调用rand函数,不指定种子,系统就会调用默认的种子来产生随机数,因为默认种子一定,运行出来的结果序列就一定了,在 C++ 中,可以通过调用 srand 函数完成种子的设置,在 rand 被调用之前,srand 函数要先被调用,并且 srand 在整个程序中仅被调用一次。
void srand(unsigned int seed);
#include <iostream>#include <cstdlib>#include <ctime>using namespace std;int main(){unsigned seed;seed = time(0);srand(seed);cout << rand()%100<< endl;return 0;}
在上面例子中会输出一个100内的随机数,假如需要一个限制在 1 和某个最大值 max 之间的随机数,可以使用以下公式:
number = rand()%max + 1;
这里利用了求余数运算符(%),它可以获得整除之后的余数。当使用通过 rand 函数返回的正整数除以100时,余数将是 0〜99的数字。因为目标是 1〜100 的数字,所以只需要给余数加 1 即可。
叁
我们现在设计一个小游戏,由程序随机出一个100以内的数让人猜,如果猜对了,则给出猜对提示和猜的总次数,然后退出游戏。否则给出猜错提示,并提示所猜的数和正确值之间的大小关系(即猜大了还是猜小了)。游戏最多可以猜测5次,如果5次之内仍未猜中的话就退出。
#include <iostream>#include <cstdlib>#include<ctime>using namespace std;int main(){int num,m,i;srand(time(0)); //设置种子num=rand()%100; //100以内的数字cout<<"请输入猜测的数值:";cin>>m;i=1;while(num!=m&&i<10) {if(num<m){cout<<"你猜大了!"<<endl<<"请再次输入猜测值:";cin>>m;}else{cout<<"你猜小了!"<<endl<<"请再次输入猜测值";cin>>m;}i++;}if(i==10&&num!=m)cout<<"十次你都没猜中,Game over!"<<endl;elsecout<<"恭喜你猜对了!"<<' '<<"一共猜了"<<i<<"次"<<endl;return 0;}
上面例子简单利用了srand和rand来完成随机数的产生,请用其他循环语句(for或 do...while)重写例子并做优化。
肆
看下面题目,思考下该如何完成?
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。
请你协助明明完成“去重”与“排序”的工作。 输入有2行,第1行为1个正整数,表示所生成的随机数的个数:N; 第2行有N个用空格隔开的正整数,为所产生的随机数。 输出也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
1020 40 32 67 40 20 89 300 400 15
815 20 32 40 67 89 300 400





