用线性同余法生成随机数序列的公式为:
rk = ( multiplier × rk-1 + increment ) % modulus
序列中的每一个数rk都可以由它的前一个数rk-1计算出来。例如,如果有:
rk = ( 25 173 × rk-1 + 13 849 ) % 65 536
则可以产生65 536个各不相同的整型随机数。设计一个函数作随机数生成器,生成1位或2位数的随机数。
利用这个随机数生成器,编写一个小学生学习四则运算的练习程序,要求:
l 可以进行难度选择,一级难度只用1位数,二级难度用2位数;
l 可以选择运算类型,包括加、减、乘、除等;
l 可以给出错误提示;
l 可以统计成绩。

#include<iostream> using namespace std; int Rand(int,int); //生成指定范围的随机数 int main() { int w,i,r,t = 0; char op,answer; int a,b,d; while(1) //练习开始 { cout<<"现在开始?( Y或N )\n" ; cin>>answer; if (answer=='N'||answer=='n') break; while(1) { cout << "请输入难度( 1或2 ):"; cin >> w; if ( w != 1 && w != 2 ) cout << "输入难度错误,重新输入!" << endl; else break ; } while(1) { cout << "请输入运算类型( +,-,*,/ ):" ; cin >> op; if ( op != '+' && op != '-' && op != '*' && op != '/' ) cout << "输入运算符错误,重新输入!" << endl; else break; } //出10道题,每题10分 t=0; for( i=1; i<=10; i++ ) { while(1) { if( w == 1 ) { a = Rand(0,10); b = Rand(0,10); } else if( w == 2 ) { a = Rand(10,100); b = Rand(10,100); } if ( op == '-' ) if ( a<b ) continue ; //使被减数大于减数 if ( op == '/' ) if ( int( a/b ) != (a / b) ) continue; //只做结果为整数的除法 break; } cout << a << op << b << '='; cin >> d; switch ( op ) { case '+': r = a + b; break; case '-': r = a - b; break; case '*': r = a * b; break; case '/': r = a / b; break; } if ( r == d ) { cout << "你算对了,加10分!" << endl; t = t + 10; } else cout << "你算错了!" << endl; } cout << "你的成绩是:" << t << "分" << endl; } } int Rand(int m, int n) { static int r; //静态变量保留上一个随机数 do { r = ( 25173*r + 13849 ) % 65536 ; } while (r<m||r>=n); return r; }