📢 :c语言随机数生成
一,rand函数和srand函数和time函数的联系
rand函数能够生成一个随机数,因为rand函数每次都会调用srand函数来决定随机数的起始值,所以可以通过改变srand来控制随机数起始值,如果要是不主动实现srand函数的话,rand会自动调用srand函数,但是这样会导致srand的值一直不变,普遍的做法是主动实现srand,从而使得rand函数的返回值达到真正的随机。但是srand函数需要传入一个有变化的参数,这个参数就可以了使用time函数。
time函数的作用是返回一个时间戳(也就是1970年1月1日至今所经历的秒数),这样能使这个时间戳不断在变化,所以真正决定这个起始值的是time函数。srand只是rand和time的桥梁。
📢 :接下来我们分别看看这三个函数 :
二,scrand函数 :
✨先看一看srand的函数原型 :
void srand (unsigned int seed);
- 参数是一个无符号的int类型的种子(seed),这也就解释了为什么rand函数的下界是0。
- srand函数能够决定rand产生的随机数的起始值 。
- 如果种子值不变的话,会导致rand每次出现的值都不变(不同进程调用rand返回值不变,但是同一进程的多次调用rand返回值是变化的)。下面代码展示 :
✨✨可以看到,每次运行后值都是不变的。所以我们就需要让种子seed不断在变化,就用到了time函数。
三,time函数 :
time的函数原型如下 :
time_t time (time_t* timer);
⭐️返回一个time_t类型。
✨参数是一个time_t类型的指针,返回值存储在这个指针里面,当然,也可以传入一个空指针,这两种说法下面代码展示 :
#include <stdio.h> #include <time.h> int main() { time_t a; time_t b; //第一种使用方式 time(&a); //第二种使用方式 b = time(NULL); printf("t1=%ld\n",a); printf("t2=%ld",b); return 0; } //两种方法返回值相同。
使用它必须包含头文件 :#include <time.h>
所以我们把srand函数和time函数一结合,就变成了 :
srand((unsighed int )time(NULL)) ;
因为time返回的是time_t类型的,所以得把他强转成unsighed 类型的。
四,rand函数 :
下面是它的函数原型 :
int rand (void);
⭐️返回一个int类型的值,没有参数。
rand()函数每次调用前都会检查是否调用过srand函数,如果有,就会使用srand来为自己初始化自己的值。若之前没有调用srand函数,那么会自动给seed赋初始值,即srand(1)自动调用它。
如何给随机数限定范围 ?
- 可以通过取余来限制最大值,如 :
int rand_number = rand() % 100 ;
此时的rand_number的最大值不超过100(因为超过100就会向前进位,大家细细想想就能理解)。
那么要是想取范围为[10,100],该怎么表达呢?这句话也就是范围最大值不超过101,所以可以写成int rand_number = rand() % 101 ;
最小值的实现可以整体加上10来实现,但是整体加上10的话,最大值也会增加10,可以这么表达 :int rand_number = rand() % 91 + 10;
)这句意思范围是 [10,(91+10) - 1] ,也就是 :[10,100]。 - 下面给出函数的简单实现代码,大家可以复制在编译器自己运行试试 :
#include <stdio.h> #include <stdlib.h> /* srand, rand */ #include <time.h> /* time */ int main() { srand((unsigned int)time(NULL)); //control(); int i = 0; while (i < 10) { int a = rand()% 100; printf("%d ", a); i++; } return 0; }
😄新人创作不易,你的点赞和关注都是对我莫大的鼓励,再次感谢您的观看。😄