该系列为本人的学习笔记,主要由本人整理书写而成。部分内容来自教材、视频课程等,不能保证完全原创性。
萌新的学习笔记,写错了恳请斧正。
在 C 语言的 stdlib.h 头文件中,有一个能生成随机数的函数 rand ()
# rand 函数
rand 函数会返回一个在 0~RAND_MAX 之间的伪随机数
RAND_MAX 由编译器决定,一般为 32767 (0x7ffff)
为什么说是伪随机数呢?
# 伪随机
伪随机数不是真的随机抽取的,而是由对应的种子计算生成的
当种子相同时,生成随机数就会相同:
#include <stdio.h> | |
#include <stdlib.h> | |
int main() | |
{ | |
printf("%d\n", rand()); | |
printf("%d\n", rand()); | |
printf("%d\n", rand()); | |
printf("%d\n", rand()); | |
return 0; | |
} |
以上方代码为例,如果在相同环境下反复运行,其输出结果保持不变
# 随机种子
随机种子由 srand 函数设置,其值要求为 unsigned int
用法如下:
srand(一个无符号短整型); | |
// 无返回值 |
随机数通过随机种子生成
当随机种子不同时,随机数才能随机
这不就矛盾了吗?我们需要随机数才能生成随机数?
# 时间函数
这时有一个解决方案,那就是用时间作为随机种子
因为时间肯定是一直在变的嘛!
我们如何在程序中引入时间呢?
可以使用时间函数 time (需要包含 time.h 头文件):
time_t time (time_t* timer); | |
// 这是时间函数的原型 |
时间函数的返回值类型为 time_t (32 或 64 位的整型)
当 time 函数的参数为 NULL 时,将返回当前的时间戳
时间戳:从 1970 年 1 月 1 日 0 时 0 分 0 秒到当前时间的秒数差值
如果参数不是 NULL 而是一个指针,函数也会将返回的差值放在 timer 所指向的内存中
# 设置随机种子
因此,如果要使用随机数,我们应该这么写:
srand((unsigned int)time(NULL)); // 设置随机数种子 | |
printf("%d\n", rand()); |
设置随机数种子建议放主函数开头
# 设置随机数范围
比方说要生成 0-99 间的随机数,我们可以:
rand() % 100
如果是 1-100 间:
rand() % 100 + 1
如果是 1-666 间:
rand() % 666 + 1
由此可以得到,在 a-b 间:
a + rand() % (b-a+1)
# 猜数字
这样我们可以写一个猜数字游戏:
#include <stdio.h> | |
#include <time.h> | |
#include <stdlib.h> // 利用此头文件中的 system 函数可以实现清屏 | |
void menu() | |
{ | |
printf("******************\n"); | |
printf("**1.guess-number**\n"); | |
printf("**0.exit-game **\n"); | |
printf("******************\n"); | |
} | |
void game() | |
{ | |
system("CLS"); // 清屏 | |
int num = rand() % 100 + 1; | |
int guess = 0; | |
int cnt = 1; | |
while(1) | |
{ | |
printf("答案在1~100之间,请开始你的表演:\n"); | |
scanf("%d", &guess); | |
if (num < guess) | |
{ | |
system("CLS"); | |
printf("好大~\n"); | |
} | |
else if (num > guess) | |
{ | |
system("CLS"); | |
printf("行不行啊~细狗~\n"); | |
} | |
else | |
{ | |
system("CLS"); | |
printf("对喽~\n"); | |
break; | |
} | |
cnt++; | |
} | |
if (1 == cnt) | |
printf("Ohhhhhhhhhhh\n一次猜中的欧皇!\n"); | |
else if (cnt <= 5) | |
printf("666\n你用%d次就猜中了!\n", cnt); | |
else if (cnt <= 10) | |
printf("就这?就这?!\n你用了%d次才猜中\n", cnt); | |
else | |
printf("好好好,这么玩是吧?\n%d次猜中,太菜了\n", cnt); | |
} | |
int main() | |
{ | |
int cs = 0; | |
srand((unsigned)time(NULL)); | |
do | |
{ | |
menu(); | |
scanf("%d", &cs); | |
switch (cs) | |
{ | |
case 1: game(); break; | |
case 0: break; | |
default: system("CLS"); printf("你在瞎输什么?啊?\n"); | |
} | |
} while (cs); | |
return 0; | |
} |