如何生成1~100随机数
最近在写一个如何生成随机数的练习:生成一个1~100的随机数,通过百度我发现到是要调用sand函数来实现的,接下来我们慢慢深入了解吧!
得知我们生成随机数要用到sand函数,但我们并不知道这个函数究竟是如何运行的,接下来我们可以在MSDN里查看这个函数的用法。
通过查看后,得知这个函数会返回一个从0到RAND_MAX的随机整数,对此我并不知道它的数值于是多少,于是我们右键点击转到定义。
#define RAND_MAX 0x7fff
发现define定义的 RAND_MAX大小是0x7fff,转换成十进制也就是32767,也就是说这个函数可以返回一个从0~32767的整型。接下来我们实战一下发现
本以为已经可以生成随机数了,可但是当我第二次运行时发现,它生成的还是这些随机数,也就是说,第一次生成的随机数和第二次生成的是相同的。我这细想肯定出错了,回头看在描述中还有第二句话:在调用rand函数之前,我们要调用srand函数设置生成随机数。对此我又在MSDN中查查srand函数:
发现srand函数的参数是一个无符号整型并且无返回值,那我们测试一下,随便给srand输入一个无符号整型比如:100。
当再一次运行的时候,程序还是照样生成一样的随机数,只有通过我们改变传入srand的参数时,生成的随机数才会改变。
那么问题来了,当我们给srand传入一个随机数,那么rand就会给我们返回一个随机数,想到这里不就出问题了吗?!我们为了生成一个随机数,现在要我们输入一个随机数才行,这不就是先有蛋还是先有鸡的问题嘛!
这时候我们想要给srand传进去一个一直在发生变化的值不就OK了吗?那什么是一直发生变化的呢?我们想到咱电脑上一直在发生变化的~~时间。这时候我们要介绍一个概念:时间戳
时间戳:当前时间相较于计算机起始时间的差值,单位是秒。
所以我们用时间戳作为随机数的生成器,那么每一个所生成的随机数都是随机的,所以我们可以给srand传一个时间戳,这时候我们就需要用到time函数,C语言提供的time函数,可以返回一个时间戳。
这里我们可以看到time函数的参数是time_t型指针,返回值是time_t型。通过转到定义发现,是整型和长整型类型,其实time函数最终返回的是一个整数。
如果创建一个time_t t;即可把t的地址传给参数timer,那么函数就把时间戳的时间放在了t里面,当然这个参数我们也可以不用,于是我们就向time函数传入一个空指针( NULL)即可。当然也可以通过返回值把时间戳返回来,所以我们如果要将time函数的返回值传入srand函数,那么我们就需要将time函数的返回值强制性转化会unsigned int型。
这样就真正的产生随机数了!但是生成的随机数不在1~100的范围里面。
如何生成规定位数的随机数呢:(1~100)
int ret = rand()%100+1;
可知任何一个数字%100余的数字只能取0~99,我们只需要将所得随机数对100取余数,那么我们得到的数就是0-99的数字,这时再加上1便是1-100的数字了。
同理:要生成三位数:
int ret = rand()%1000+1;
以下是猜数字游戏的全部代码
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<time.h> void menu() { printf("******1.play*******\n"); printf("******0.exit*******\n"); printf("*******************\n"); printf("*******************\n"); } void game() { int guess = 0; //1.生成一个随机数 srand((unsigned)time(NULL)); int ret = rand()%100+1; //2.猜数字 while (1) { printf("猜数字:>\n"); scanf("%d",&guess); if (guess < ret) { printf("猜小了\n"); } else if (guess > ret) { printf("猜大了\n"); } else { printf("恭喜你猜对了\n"); break; } } } int main() { int input = 0; do { menu(); printf("请选择:>"); scanf("%d",&input); switch (input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("选择错误,请重新选择!\n"); break; } } while (input); return 0; }
那么到这里就已经讲解完啦,如果文中有错误请指出。