详解C语言随机数设置的三种方式(保姆级教程)

目录
  • 前言
  • 随机数设置三板斧
    • 第一式:rand函数
    • 第二式:srand函数
    • 第三式:time函数

前言

本篇文章将为大家介绍在C语言中如何设置随机数,在设置随机数的过程中,大家可能会遇到以下问题:

1、每次进入程序后的随机数与上一次相同。

2、当随机数设置过快时,可能会相同。

3、如何设置指定范围的随机数。

随机数设置三板斧

在设置随机数的时候,我们需要用到三个函数,它们分别是rand,time,srand。下面将一一进行讲解:

第一式:rand函数

我们可以打开MSDN去看看rand函数的定义:

rand函数的参数为空,返回值是一个0到RAND_MAX的整型数字。转到定义,我们可以看到,RAND_MAX的值为0x7fff。转为十进制为32767。

下面我们可以写一段代码生成10个随机数并将它打印出来:

int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		int ret = rand();
		printf("%d ", ret);
	}
	printf("\n");
	return 0;
}

我们可以运行看看,可以得到10个随机数字:

但是细心的小伙伴就发现了(记得自己敲代码观察结果,由于本人不会做动图,就麻烦各位佬自己敲代码看了),好像每次运行代码生成的10个随机数都是一样的。那是因为我们没有设置随机数种子,下面我们将讲解如何设置随机数种子:

第二式:srand函数

再次打开MSDN,查看我们的srand函数的定义:

我们可以看到:srand函数的参数为一个无符号整型数字,返回值为零,随机数种子的设置是为了生成随机数。

下面我们将设置一个随即数种子再次生成10个随机数:

int main()
{
	int i = 0;
	srand(666);
	for (i = 0; i < 10; i++)
	{
		int ret = rand();
		printf("%d ", ret);
	}
	printf("\n");
	return 0;
}

好了,这次我们设置了一个随机数种子,这下应该不会出问题了吧。我们再次运行我们的代码:

细心的朋友又又又会发现了,这次怎么还是不管运行多少次代码,结果还是一样的呀,作者你这不坑人嘛!各位佬请冷静,当srand函数中的参数是一个变化的数的时候我们才会生成真正的随机数(就像你遇到一个路口,每次你都进入同一个路口,那尽头不都是一样的嘛,只有当你选择不同的路口进入的时候终点才不一样)。那这个时候又有小伙伴要说话了,作者你拿我寻开心呢?你说要生成一个随机数,这里你用srand又要用一个变化的参数,这不两头难嘛?

xdm别急。不妨想想在我们的计算机中什么是变化的?那不就是时间嘛?时间可是无时无刻不在改变。

小结:当我们在调用rand函数生成随机数的时候。我们需要设置随机数种子,如果我们设置的随机数种子相同,那么产生的随机数也是相同的,所以这时候我们就要设置不同的随机数种子。在计算机中时间是变化的,所以我们可以用时间来做随机数种子,每次程序运行的时间都不同,这样就可以得到我们的随机数了。

这里就要讲到我们的time函数了

第三式:time函数

这里我们先讲讲时间戳:

Unix时间戳是指从1970年1月1日开始所经过的秒数,不考虑闰秒。

再次查看time函数的定义:(ps:C语言中的time函数调用后会返回一个时间戳

这里的time_t的本质其实是一个64位的整型。我们可以看到time函数的参数是一个指针,那我们直接给他传一个空指针就可以了。

值得注意的是:这里的返回值类型为time_t,有的编译器可能会发生警告,为了防止编译器警告,我们可以将它强制转换为unsigned int类型。

那么现在我们就可以解决刚刚的问题了,我们修改一下代码,再次运行。

int main()
{
	int i = 0;
	srand((unsigned int)time(NULL));
	for (i = 0; i < 10; i++)
	{
		int ret = rand();
		printf("%d ", ret);
	}
	time_t;
	printf("\n");
	return 0;
}

现在我们运行程序的话就会发现,随机数生成成功了。

常见问题:

1、每次进入程序后的随机数与上一次相同。

这是因为我们在设置随机数的时候 没有设置种子 或者 设置种子的srand函数中的参数不是一个变化的值(参数不是时间戳)。

2、当随机数设置过快时,可能会相同。

在设置随机数的时候,我们只需要设置一个随机种子就行了,如果我们每生成一个随机数就设置一个随机种子的话,由于程序运行的时间太快,可能时间戳会相同,从而产生的随机数也一样。

例如:

int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		srand(time(NULL));
		int ret = rand();
		printf("%d ", ret);
	}
	time_t;
	printf("\n");
	return 0;
}

我们运行一下程序:

所以,我们在设置随机数的时候一定要检查是否只设置了一个随机数。

3、如何设置指定范围的随机数。

在设置随机数的时候,如果我们想要生成的随机数在一定范围内,那么我们就要对随机数进行一点小小的处理:

如果想要生成的随机数落在(0,n)

int q = rand()%(n+1) //生成的数与(n+1)整除,所以不包含n+1

随机数落在(1,n)

int q = rand()%n + 1;

随机数可以根据我们的需要进行设置,希望各位小伙伴能够灵活运用,今天的分享就到这里了,希望我的文章能够帮助到大家。要是有什么不对的地方也请各位指正。目前文章可能排版不是很好,但是我会努力的,希望自己的文章能够越写越好。祝各位水平越来越高,都能拿到好offer。

到此这篇关于详解C语言随机数设置的三种方式(保姆级教程)的文章就介绍到这了,更多相关C语言随机数设置内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言/C++中如何产生随机数

    C语言/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,和time()函数. 需要说明的是,iostream头文件中就有srand函数的定义,不需要再额外引入stdlib.h;而使用time()函数需要引入ctime头文件. 使用rand()函数获取一个随机数如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间.RAND_MAX定义在stdlib.h, 其值为2147483647. 例子

  • C语言的随机数rand()函数详解

    在生活中很多场景下都需要产生随机数,比如抽奖,打牌,游戏等场景下就需要使用随机数.在C语言标准库函数里面有专门用来产生随机数的函数rand,它的函数原型如下: int __cdecl rand(void); rand函数没有参数,它的返回值就是随机数.下面通过一个简单的例子来测试一下rand函数. #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { int i; i = rand(); p

  • C语言/C++如何生成随机数

    本文分享了C语言/C++如何生成随机数的具体实现方法,供大家参考,具体内容如下 C语言/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,C语言/C++里没有自带的random(int number)函数. (1) 如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间.RAND_MAX定义在stdlib.h, 其值为2147483647. 例如: #include<stdio.h> #i

  • C语言连续生成随机数的实现方法

    srand()设置随机数种子 rand()生成0 - RAND_MAX范围的随机数 加上其他运算,我们能够生成任意范围的随机数 .rand()是将随机数表里面的随机数顺序输出.所以,如果不设定随机数种子,生成的随机数是固定的. int main() { char str[10] = {0}; int j =0; while(j < 10) {//生成随机的三个数字 int i = strlen(str); for (;i < 3;i++){ str[i] = '0' + rand() % 10

  • c语言随机数函数示例

    void srand( unsigned int seed );head file is <stdlib.h>RemarksThe srand function sets the starting point for generating a series of pseudorandom integers. To reinitialize the generator, use 1 as the seed argument. Any other value for seed sets the g

  • C语言中随机数rand()函数详解

      在生活中很多场景下都需要产生随机数,比如抽奖,打牌,游戏等场景下就需要使用随机数.在C语言标准库函数里面有专门用来产生随机数的函数rand,它的函数原型如下: int __cdecl rand(void);   rand函数没有参数,它的返回值就是随机数.下面通过一个简单的例子来测试一下rand函数. #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { int i; i = rand(

  • 详解C语言随机数设置的三种方式(保姆级教程)

    目录 前言 随机数设置三板斧 第一式:rand函数 第二式:srand函数 第三式:time函数 前言 本篇文章将为大家介绍在C语言中如何设置随机数,在设置随机数的过程中,大家可能会遇到以下问题: 1.每次进入程序后的随机数与上一次相同. 2.当随机数设置过快时,可能会相同. 3.如何设置指定范围的随机数. 随机数设置三板斧 在设置随机数的时候,我们需要用到三个函数,它们分别是rand,time,srand.下面将一一进行讲解: 第一式:rand函数 我们可以打开MSDN去看看rand函数的定义

  • 详解JS异步加载的三种方式

    一:同步加载 我们平时使用的最多的一种方式. <script src="http://yourdomain.com/script.js"></script> <script src="http://yourdomain.com/script.js"></script> 同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止后续的解析,只有当当前加载完成,才能进行下一步操作.所以默认同步执行才是安全的.但这样如果js中有输

  • 详解Nginx 虚拟主机配置的三种方式(基于IP)

    Nginx配置虚拟主机支持3种方式:基于IP的虚拟主机配置,基于端口的虚拟主机配置,基于域名的虚拟主机配置. 详解Nginx 虚拟主机配置的三种方式(基于端口) https://www.jb51.net/article/14977.htm 详解Nginx 虚拟主机配置的三种方式(基于域名) https://www.jb51.net/article/14978.htm 1.基于IP的虚拟主机配置 如果同一台服务器有多个IP,可以使用基于IP的虚机主机配置,将不同的服务绑定在不同的IP上. 1.1

  • 详解Golang开启http服务的三种方式

    前言 都说go标准库实用,Api设计简洁.这次就用go 标准库中的net/http包实现一个简洁的http web服务器,包括三种版本. v1最简单版 直接使用http.HandleFunc(partern,function(http.ResponseWriter,*http.Request){}) HandleFunc接受两个参数,第一个为路由地址,第二个为处理方法. //v1 func main() { http.HandleFunc("/", func(w http.Respon

  • 详解使用scrapy进行模拟登陆三种方式

    scrapy有三种方法模拟登陆方式: - 直接携带cookies - 找url地址,发送post请求存储cookie - 找到对应的form表单,自动解析input标签,自动解析post请求的url地址,自动带上数据,自动发送请求 1.携带cookies登陆github import scrapy import re class Login1Spider(scrapy.Spider): name = 'login1' allowed_domains = ['github.com'] start_

  • 详解Redis实现限流的三种方式

    面对越来越多的高并发场景,限流显示的尤为重要. 当然,限流有许多种实现的方式,Redis具有很强大的功能,我用Redis实践了三种的实现方式,可以较为简单的实现其方式.Redis不仅仅是可以做限流,还可以做数据统计,附近的人等功能,这些可能会后续写到. 第一种:基于Redis的setnx的操作 我们在使用Redis的分布式锁的时候,大家都知道是依靠了setnx的指令,在CAS(Compare and swap)的操作的时候,同时给指定的key设置了过期实践(expire),我们在限流的主要目的就

  • 详解Spring Boot 访问Redis的三种方式

    目录 前言 开始准备 RedisTemplate JPA Repository Cache 总结 前言 最近在极客时间上面学习丁雪丰老师的<玩转 Spring 全家桶>,其中讲到访问Redis的方式,我专门把他们抽出来,在一起对比下,体验一下三种方式开发上面的不同, 分别是这三种方式 RedisTemplate JPA Repository Cache 开始准备 开始之前我们需要有Redis安装,我们采用本机Docker运行Redis, 主要命令如下 docker pull redis doc

  • 详解Nginx 虚拟主机配置的三种方式(基于端口)

    Nginx配置虚拟主机支持3种方式:基于IP的虚拟主机配置,基于端口的虚拟主机配置,基于域名的虚拟主机配置. 详解Nginx 虚拟主机配置的三种方式(基于IP) https://www.jb51.net/article/14974.htm 详解Nginx 虚拟主机配置的三种方式(基于域名) https://www.jb51.net/article/14978.htm 2.Nginx基于端口的虚拟主机配置 如一台服务器只有一个IP或需要通过不同的端口访问不同的虚拟主机,可以使用基于端口的虚拟主机配

  • 详解Redis集群搭建的三种方式

    一.单节点实例 单节点实例还是比较简单的,平时做个测试,写个小程序如果需要用到缓存的话,启动一个 Redis 还是很轻松的,做为一个 key/value 数据库也是可以胜任的 二.主从模式(master/slaver) redis 主从模式配置 主从模式: redis 的主从模式,使用异步复制,slave 节点异步从 master 节点复制数据,master 节点提供读写服务,slave 节点只提供读服务(这个是默认配置,可以通过修改配置文件 slave-read-only 控制).master

  • 详解SpringBoot静态方法获取bean的三种方式

    目录 方式一  注解@PostConstruct 方式二  启动类ApplicationContext 方式三 手动注入ApplicationContext 方式一  注解@PostConstruct import com.example.javautilsproject.service.AutoMethodDemoService; import org.springframework.beans.factory.annotation.Autowired; import org.springfr

随机推荐