(找出数据成员和成员函数并用C++的类表示出来即可)
1)笔、钢笔
2)文件、目录
3)打印机、显示器
4)太阳、月亮
4.练习读懂类的代码,练习使用已有的类。
下面的TRandom类是用线性调和算法,实现的一个伪随机数发生器,仔细阅读代码,理解其含义。
线性调和算法的基本原理是:不断用X= ((N*X+M)mod K ) 进行迭代计算,那么得到的无穷多个x值,近似于在(0,K)上的均匀分布.其中N,M,K为较大的数(N最好是素数).
#include
#include
//#include
//#include
class TRandom
{
public:
//缺省使用系统时间(开机后经过的毫秒数)为种子
TRandom (long seed=0) { mSeed=(seed?seed: GetTickCount()); }
//也可以定义自己的种子
void Seed(long seed=0) { mSeed=(seed?seed: GetTickCount( )); }
//取得一个随机的整数
int Integer() { return Next();}
//取得一个在指定范围内的随机整数
int Integer(int min,int max) { return min+Next()%(max-min+1);}
//取得一个随机的(0到1之间的)小数
double Real() {return double(Next())/double(INT_MAX);}
private:
//使用调和算法
void Change() {mSeed=(314159265*mSeed+13579)%ULONG_MAX;}
//取得伪随机数发生器的随机数序列中的下一个随机整数
int Next() {
int loops=mSeed%3;
for (int i=0;i<=loops;i++)
Change ();
return int(mSeed/2);
}
unsigned long mSeed; //随机数发生器的种子
};
现有一个大小为54的整型数组,其元素分别为0,1,2,…,53.
1) 注意类中的public和 private, 理解访问控制的作用.
2)请利用给出的TRandom类,完成此数组的”洗牌”过程,并输出洗牌后的顺序。写出相应的完整C++程序。
思考:用TRandom类,洗牌后,54张牌的排列大约多少种可能?现实中54张可有多少种排列方法?
5.一个骰子(dice)有6个面,各面的点数分别为1,2,3,4,5,6,但各面之间的相对位置是固定的。
请实现Dice类,其主要完成
1) 模拟掷骰子过程(Cast),并返回掷得得点数;
2)报告当前各面的点数。
3) 模拟一次掷两个或多个骰子,并返回得到的总点数。
实现该类时,取得随机数可使用系统函数srand和rand,也可使用上例中的TRandom类。