首页 > 其他分享 >C语言rand、srand库函数生成随机数(附时间戳)

C语言rand、srand库函数生成随机数(附时间戳)

时间:2024-03-30 13:05:17浏览次数:25  
标签:rand 函数 srand 随机数 time 库函数

前言:当我们想要用C语言写程序来获取一个随机数时,该如何获取呢?这里我们上百度搜索一下

这里就有提到使用rand、srand、time库函数搭配来获取随机数,也许根据其所说我们已经可以获得随机数解决问题,但想问题不能只浮于表面,下面我们来深入认识一下rand、srand、time库函数。

一、rand库函数

rand函数详尽信息:rand - C++ Reference (cplusplus.com)

rand函数是不需要给其传参数,其返回类型为int。

rand函数其返回值是介于(0~RAND_MAX)的随机值,RAND_MAX有多大呢?我们可以拷到vs里转定义

0x7fff是一个十六进制数字,其十进制值为32,767,也就是说rand函数可以随机生成一个值在0~32767的随机数,看到这是不是感觉问题已经搞定了,别高兴太早!

 

这里提到rand函数生成的是一个伪随机数,这个随机数是基于“种子”之上生成的,我们来看看。

这里我们观察到两次运行得出的数据是一样的,那么这还能算得上随机数吗,都可以预测值了。

如果再深入了解⼀下,我们就不难发现,其实rand函数生成的随机数是伪随机的,伪随机数不是真正的随机数,是通过某种算法生成的随机数。真正的随机数的是无法预测下⼀个值是多少的。而rand函数是对⼀个叫“种子”的基准值进行运算生成的随机数。所以这里引出了srand库函数来对“种子”进行设置

二、srand库函数

srand函数详尽信息:srand - C++ Reference (cplusplus.com)

srand函数需要接收一个无符号整形作为参数,其没有返回值,只用来执行设置rand函数“种子”的功能。程序中在调用rand函数之前先调用srand函数,通过srand函数的参数seed来设置rand函数生成随机数的时候的“种子”,只要“种子”在变化,每次生成的随机数序列也就变化起来了

通过srand函数的参数seed来设置rand函数生成随机数的时候的“种子”。

这里我们可以看出通过srand函数对“种子”的设置,rand函数确实随机了起来,但是srand函数的参数如果不是一个随机值rand函数就不可能随机,但是我们就是要生成一个随机数,现在又需要一个随机数,这不是逻辑闭环了吗?那么如何让srand函数的参数随机起来呢?

三、time库函数

在程序中我们⼀般是使用程序运行的时间作为“种子”的,因为时间时刻在发生变化的。在C语言中有⼀个函数叫time,就可以获得这个时间。
time函数详尽信息:time - C++ Reference (cplusplus.com)

time函数会返回当前的日历时间,其实返回的是1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒。返回的类型是time_t类型的,time_t类型本质上其实就是32位或者64位的整型类型。

time函数的参数timer如果是非NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。如果timer是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳

时间戳:

time(NULL);//调⽤time函数返回时间戳,这⾥没有接收返回值

这样一来time函数也就返回时间戳了,因为时间总是在变化的,所以我们只要把时间戳传入srand函数即可。考虑到srand函数参数类型为unsigned int而time函数返回类型为time_t,为了不造成类型冲突,这里强制类型转换一下。

srand((unsigned int)time(NULL));

四、rand、srand、time函数配合使用生成随机数

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
	//使⽤time函数的返回值设置种⼦
	//因为srand的参数是unsigned int类型,我们将time函数的返回值强制类型转换
	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随机数:

srand((unsigned int)time(NULL));
int ret = rand() % 100 + 1;

满一百就舍去,我们只需要将所得随机数对100取余数(可以得到0~99)再+1,那么我们得到的数就是1-100的数字,这时再加上1便是1~100的数字了。

六、补充说明

1.rand、srand库函数头文件为<stdlib.h>,time库函数有文件为<time.h>。

2.对于srand函数在每次程序开始调用一次对“种子”设置一下就好,不必频繁使用。
 

标签:rand,函数,srand,随机数,time,库函数
From: https://blog.csdn.net/ximiemie0525/article/details/137163541

相关文章

  • CF1615F LEGOndary Grandmaster
    CF1615FLEGOndaryGrandmaster计数好题,转换条件+转化贡献+组合数首先题目的操作没有什么好的性质,考虑一个经典的trick,将奇数位置上的数字取反,于是题目的操作变成\(01\rightarrow10\)或\(10\rightarrow01\)。这个操作的性质就是序列中\(1\)的总数不变,并且操作可以抽象......
  • Python常用模块(random随机模块&json序列化模块)
    1.random随机模块返回两数之间的随机数,不包括尾数:random.randrange()importrandomprint(random.randrange(1,10))#3返回两数之间的随机数,包括尾数:random.randint()importrandomprint(random.randint(1,10))#返回1-10之间的一个随机数,包括10#7随机选取0到100间......
  • Atcoder ABC242H Random Painting
    对于这个\(\max\)似乎没有什么好的办法,考虑\(\min-\max\)反演。记\(t_i\)为第\(i\)格被染黑的时间,有\(E(\max(t_i))=\sum\limits_{S}(-1)^{|S|+1}E(\min(t_i))(i\inS)\)。考虑如果知道了\(S\),那么就可以知道\(c=\sum\limits_{i=1}^m[[l_j,r_j]\capS\no......
  • C语言进阶篇之字符函数和字符串函数(含模拟实现库函数)
    本篇主要整理了C语言字符函数和字符串函数的介绍,使用,以及库函数的模拟,持续更新中。老铁们,整理不易,创作不易,先赞后看养成习惯,你的支持是对我更新最大的鼓励!函数介绍与模拟实现1.1strlen求字符串长度size_tstrlen(constchar*str);注:1.字符串已经'\0'作为结束标......
  • stm32库函数_小知识
    stm32库函数值计算#definePOSITION_VAL(VAL)(__CLZ(__RBIT(VAL)))在STM32中的作用是计算指定值VAL在二进制表示中最高位的位置。这里使用了一些内置的CMSIS函数,包括__RBIT(反转位顺序)和__CLZ(计算前导零位数)。解释:__RBIT(VAL):反转VAL的位顺序。例如,如果VAL的二进......
  • OpenMP - runtime库函数
    常用函数。#include<iostream>#include<omp.h>#defineNUM_THREADS16usingnamespacestd;intmain(intargc,char*argv[]){omp_set_num_threads(NUM_THREADS);#pragmaompparallel{cout<<"threadnum:"<&......
  • Light Random Sprays Retinex 传统的图像增强算法LRSR
    文章目录前言1、LightRandomSpraysRetinex概况2、LightRandomSpraysRetinex具体实现2.1、噪声去除2.2、亮度调整2.3、插值技术3、LightRandomSpraysRetinex源码4、LightRandomSpraysRetinex效果及结论前言  LightRandomSpraysRetinex,即“光随......
  • numpy中random.seed()与random.RandomState()的区别
    1.random.seed()用处:初始化随机数生成器。设置随机数生成器种子后,直接生成随机数即可,无需在随机数生成器条件下运行。2.random.RandomState()作用:获得随机数生成器 比较上面两图可以看出,获取随机数生成器之后,必须在此条件下运行,才可生成相同的随机数,若不在此条件下运行,随......
  • 标准库之rand
    目录一、rand库介绍二、math/rand1.基本使用2.常用的方法3.生成定长的随机数三、crypto/rand一、rand库介绍在Go中,有两个包提供了rand,分别为math/rand和crypto/rand,对应两种应用场景math/rand包实现了伪随机数生成器。也就是生成整型和浮点型crypto/rand包实......
  • python 猜数字 random
    #猜数字如果数字太大则输出Toolarge!如果数字太小则输出Toosmall!如果猜中则输出Justright!importrandomnumber=random.randint(1,100)whileTrue: num=int(input('输入1-100之间的数')) ifnum>number: print('你猜的数字太大了请重新输入') elifnu......