(MSDN中rand和srand函数的描述)
rand函数原型 int rand(void),这个函数会返回0 ~ RAND_MAX(32767)间的值
srand函数原型 void srand( unsigned int seed )
我们先来测试rand函数。
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%dn", rand());
}
return 0;
}
程序输出了10个随机数,但是如果我们再运行一次程序,输出的随机数却是一样的。问题出在哪?我们从rand的描述中得知,在使用rand之前要先调用一次srand,而如果我们不调用srand,系统会自动调用并且默认将1传给srand,我们在for循环前调用srand并且也将1传给srand,看输出的结果是否和刚刚一样。
int main()
{
int i = 0;
srand(1);
for (i = 0; i < 10; i++)
{
printf("%dn", rand());
}
return 0;
}
可以看出两次的结果是一样的。
srand作为随机数生成器的初始化函数,它会给rand一个种子,不同种子对应的随机数组不同,因此我们要给srand传不同的值,使rand生成随机数。那我们要怎么实现?
这里我们可以调用time函数,让time返回当前的时间戳,当我们在不同时间调用srand时,rand输出随机数。
(时间戳:从1970年1月1日零时零分零秒到目前为止所经过的秒数)
int main()
{
int i = 0;
srand((unsigned int)time(NULL));
for (i = 0; i < 10; i++)
{
printf("%dn", rand());
}
return 0;
}
这样就能成功实现。
srand((unsigned int)time(NULL));
那为什么要把time返回的数强制类型转化成无符号整型?
srand调用的数规定是unsigned int,而time返回值类型是int,所以要使用srand必须强制类型转换。
用这对函数实现猜数字游戏#include#include #include #include void menu() { printf("*****************************n"); printf("****** 1.开始游戏 ******n"); printf("****** 2.结束游戏 ******n"); printf("*****************************n"); } void game() { printf("开始游戏,请输入数字n"); int random = rand() % 100 + 1; int guess = 0; while (1) { scanf("%d", &guess); if (guess > random) { printf("猜大了n"); } else if (guess < random) { printf("猜小了n"); } else { printf("恭喜你,猜对了n"); break; } } } int main() { srand((unsigned int)time(NULL)); int input = 0; do { menu(); printf("请选择<1/0>n"); scanf("%d", &input); switch(input) { case 1: game(); break; case 0: break; default: printf("输入错误,请重新选择n"); break; } } while (input); return 0; }
在完成这个游戏后,感觉对于这些函数还是一知半解,所以整理了这篇博文来强化自己对于它们的理解。因此对于它们的介绍也没有深入,这篇文章如有错误,欢迎大家指正。



