3 min to read
椋鸟C语言笔记#10
随机数的生成
萌新的学习笔记,写错了恳请斧正。
在 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;
}
Comments