网站备案查询官网入口,广州工商注册服务中心,本科自考第二学位,黑客是如何攻击网站的rand随机数
rand
C语言中提供了一个可以随机生成一个随机数的函数#xff1a;rand#xff08;#xff09; 函数原型#xff1a;
int rand(void);rand函数返回的值的区间是#xff1a;0~RAND_MAX(32767)之间。大部分编译器都是32767。
#includestdlib.h
int ma…rand随机数
rand
C语言中提供了一个可以随机生成一个随机数的函数rand 函数原型
int rand(void);rand函数返回的值的区间是0~RAND_MAX(32767)之间。大部分编译器都是32767。
#includestdlib.h
int main()
{printf(%d, RAND_MAX);return 0;
}要想使用这个rand函数需要包含头文件#includestdlib.h 但是rand函数直接使用是提供的伪随机数这个随机数是有有迹可循的没有实现真正的随机这是因为它生成这个数是基于一个确定的算法而生成的。
int main()
{int x rand();int y rand();printf(%d %d\n, x, y);return 0;
}执行第一次 执行第二次 可以看出两次执行的随机数相同所以单纯使用rand函数生成不了真正的随机数。 所以要想真正实现随机生成需要使rand() 函数基于一个种子seed来生成默认情况下这个种子是1。 每次调用 rand()它都会基于前一个随机数生成下一个随机数。这意味着如果你多次使用相同的种子调用 rand()你会得到相同的随机数序列。
srand
C语言又提供了一个初始化随机数的函数srand 函数原型
void srand(unsigned int seed);注意seed的数据类型是unsigned int 在程序中显示有srand函数确定一个种子只要种子在变化rand函数生成的随机数也就在变化。也就是说只要srand的种子是随机的rand就能生成随机数在生成随机数的同时又生成一个随机数这就矛盾了。所以种子的随机不能由我们来确定所以我们交给time函数
time
在程序中我们一般使用程序运行时间作为种子的因为时间时刻在发生变化就省去我们去随机种子了。 在C语言中有一个表示时间的函数time 函数原型
time_t time(time_t* timer);timer是一个可选的参数如果提供了这个参数那么函数会将返回的时间从1970年1月1日00:00:00 开始到现在的秒数存储在这个参数指向的变量中。如果这个参数是NULL那么函数只返回时间值而不存储它。 要想使用time需要头文件#includetime.h 代码实现
#includetime.h
#includestdio.h
int main() {printf(%d,time(NULL));return 0;
}这是一个时间戳就是从1970年1月1日00:00:00 开始到现在的秒数。 先在浏览器中找一个可以转换时间戳的网站 将代码结果复制并放在转换工具里就可以看到当前时间
所以我们用time函数的返回值充当srand函数的参数就可以返回一个随机值了。
#includestdio.h
#includetime.h
#includestdlib.h
int main() {srand((unsigned int)time(NULL));int x rand();int y rand();printf(%d %d\n, x, y);return 0;
}执行第一次 执行第二次 这样就可实现随机值生成了。
设置随机数的范围
当我们可以生成随机数的时候就可以设置随机数生成范围了上文说过随机数生成范围是0—32767我们可以要rand%100就可以得到得到0—99之间的数了这是因为不管什么数对100求余只能得到0—99的数。 所以 生成0~99之间的随机数 rand %100生成1~100之间的随机数 rand %1001;生成a~b之间的随机数 a rand % (b-a1);猜数字小游戏
问题 写一个随机猜数字小游戏只有10次机会超过则失败 规则 电脑自动生成1~100的随机数 2.玩家猜数字猜数字过程中根据数据的大小给出大了或者小了的反馈在10次猜测中猜对了则游戏结束。 代码实现
#includestdio.h
#includetime.h
#includestdlib.h
void interface(void) {//游戏界面printf(******************\n);printf(****1 游戏开始****\n);printf(****2 退出游戏****\n);printf(******************\n);
}
void game(void) {int type 10;//只有10次猜测机会int result rand() % 100 1;//产生1~100之间的随机数int guess 0;while (type) {//只有还有机会时才进入循环printf(还有%d次机会, type);printf(请猜测数字);scanf(%d, guess);if (guess result) {printf(猜小了\n);}else if (guess result) {printf(猜大了\n);}else {printf(恭喜猜对了\n);break;}type--;//while循环一次机会少一次}if (type 0) {printf(机会用完了答案是%d\n, result);}
}
int main() {//控制是玩游戏还是退出游戏srand((unsigned int)time(NULL));//设置种子以确保生成正确的随机数int n 0;do {interface();//调用界面函数printf(请选择);scanf(%d, n);//选则游戏模式switch (n) {case 1:game();break;case 2:printf(游戏结束\n);break;default :printf(选择错误重新选择\n);break;}} while (n);//当选则了再进入循环return 0;
} 易错点
这段代码可能有几个易错点我一一指出 1. 如果把产生随机数的代码放在循环里面那么每次猜测都是一个新的随机数那么只有一次机会可以猜测。 2. 这里把大小于关系写错了那么根据提示就永远也猜不出答案了。 3. 这里把种子函数放在循环里面了这样做的后果是随机生成的值相似甚至相同。这是因为time(NULL) 返回的时间值在两次迭代之间几乎没有变化导致种子几乎相同进而产生相似的随机数序列。 可以代码验证一下 int main() {while (1) {srand((unsigned int)time(NULL));printf(%d\n, rand());}return 0;
}所以写这个代码时应该注意。
/考研势在必行/