rand
C语言提供了一个rand函数,这个函数是可以随机生成的,但生成范围在 0-RAND_MAX 之间,这个大小是依赖编译器实现的,但大多数编译器到32767,rand 函数使用的头文件是:stdlib.h 如果我们对它进行生成打印到屏幕,我们会发现第一次运行是随机数,但两次运行的结果是一样的。所以 rand函数生成的随机数是伪随机数。 第一次打印是随机的,他是对⼀个叫“种⼦”的基准值进⾏运算⽣成的随机数。第二次打印也是找这个种子。
#include<stdio.h>
#include <stdlib.h>
int main()
{
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
srand
C语言中有个 srand 函数,他是用来初始化随机数的生成器,也就是在打印之后实现对"种子“的初始化,当“种子”随机的时候便可以达到让 rand 生成随机数。我们以程序为例子,在 strand(x) 如果x是随机的那么rand生成的数也是随机的。x不同所生成的随机数也是不同的 这就是说在生成随机数的时候在生成一个随机数。这是就矛盾了。因为我们要想实现随机数还要解决 srand()函数随机值的问题。怎么解决呢?是不是只需要找到一个可以让x变换的数不见可以了。
#include<stdio.h>
#include <stdlib.h>
int main()
{
srand(3);
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
time
time()函数可以获得时间。而时间是随时随地在变换的,时间在变 srand在变 srand在变 ”种子也在变“,后面生成的数字就不一样了。所以我们可不可以尝试用这个函数来实现x的值的变换呢。
time函数返回的是时间戳,时间戳:是从1970年1月1日开始所经过的秒数,不考虑闰秒。而这个数字就可以换算成时间。也就是返回当前日历的时间。
time函数的参数是一个指针变量,如果不想用这个值,就向它传一个空指针。time(NULL) 又因为这个函数返回的类型是 time_t 但是srand函数要的是 unsigned int 类型的函数,所以我们要强制类型转换一下。unsigned 关键字,表⽰该类型不带有正负号,只能表⽰零和正整数。time函数的使用要包含头文件 #include <time.h>
#include<stdio.h>
#include <stdlib.h>
int main()
{
srand((unsigned int)time(NULL));
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
这时候我们就已经知道了随机数生成的方法,那么如果我们要生成是随机数的1-100 或者0-100 或者随机两个数怎么输入呢?
我们知道,当我们%10的时候余数是一个一位数,%100的时候余数是一个两位数。所以当上面需要 0-99的时候 rand()%100 即可,当我们需要 100 - 200 以内的随机数的时候, 100 + rand()% 100 + 1 以此类推我们可以得出,当我们需要一个 a - b的随机数的时候 a + rand() % (b - a) + 1 。如需要一个 99 - 233 之内的数字 99 + rand() %(233-99+1) 233-99=134 134+1=135
我们可以生成一个代码来运行看一下,135余数的范围是 0-134 ,又因为 0+99=99 而 134+99=233 所以我们的取值范围就是 99-233 因此我们可以得到一个公式当我们需要一个 a - b的随机数的时候 a + rand() % (b - a + 1) 。