当前位置:首页 » 《随便一记》 » 正文

C | 随机数生成原理分析_Ersansui的博客

0 人参与  2021年12月17日 08:36  分类 : 《随便一记》  评论

点击全文阅读


随机数的应用非常广泛,生活中的抽签、彩票,以及编程中一些游戏的实现,都需要用到随机数。

那么在C语言中,如何生成随机数呢?

主要函数

    • rand
    • srand
    • time

其实在C语言中,已经给我们提供了一个生成随机数的库函数。

rand

那么这个函数是如何使用的呢?

我们可以参考一下这个网址:

http://cplusplus.com/

在这个网址中搜索:rand

可以得到一下的用法说明。

在这里插入图片描述

同学们大可不必看到英文就感到头疼,其实看关键点即可。

从①中我们可以得知,这个函数是包含在 <cstdlib> 这个头文件中,而这个头文件实际上就是我们的 <stdlib.h>。

因此,我们在使用这个函数前只需要引用<stdlib.h>*这个头文件即可。

从②中我们可以知道,该函数的返回值是一个从0到RAND_MAX的整型。

不了解RAND_MAX也没关系,我们可以百度查找,或者将其复制到VS的编译器中,

然后选中该语块,鼠标右键点击,转到定义,进行查看。

(注意:查看该定义,需要引用头文件<stdlib.h>!!)

然后我们可以看到如下代码:

#define RAND_MAX 0x7fff

0x7fff为十六进制表现形式,我们将其转化为十进制形式后得到:32767

也就是说,该函数返回的是一个从0到32767范围的整型。

但是如果你天真的认为每次生成随机数,只需要用这个函数就可以了,那么你就太天真了。哈哈哈

其实,这生成的是一个伪随机数,是系统先设定好的。只要你关闭程序,再重新生成解决方案,多试几次,你就发现,每一次生成的数字都是一样的。

srand

那么,我们想要用该函数来生成随机数,则应该先用srand这个函数来设置rand生成随机数的起点。

通过刚刚查询的网站,搜索srand可以看到如下信息。
在这里插入图片描述
从①②可以,这是一个包含在头文件<stdlib.h>中的函数,该函数的形参参数为整型,无返回类型。

从红色方框中,我们可以得知,通过给这个函数传参可以设定rand函数的随机数生成起点。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
	int n = 10;
	srand(10);
	//srand(20);
	while (n)
	{
		int tmp = rand();
		printf("%d\n", tmp);
		n--;
	}
	return 0;
}

同学们可以自己使用VS编译器,将上面的代码复制,然后自己尝试。

当你把srand(10)和srand(20)都注释掉后,不论你程序执行多少次,打印的结果都是一样的,

但是当你把srand(10)或srand(20)中的其中一个取消注释,保留其中一个,

再执行代码,就会发现,两次打印的结果不一样。

也就是说,想要rand随机数就要用给srand传入一个随机的参数,来设定rand的起点。

那么,问题来了,我需要随机数,却还要我传入一个随机数,这就有点类似与“先有鸡还是先有蛋”的问题了。
在这里插入图片描述

那么,有什么东西是时刻在变化的呢?

答案是时间!

time

这里需要介绍一个概念——时间戳。

时间戳:当前时间与计算机起始时间的差值,单位是秒。

计算机起始时间为:1970-01-01 08:00:00

随着时间的流逝,每一个时刻的时间戳都是不一样的,所以只要我们把时间戳作为参数传给srand就可以啦。

通过搜索可以知道:
在这里插入图片描述
time函数包含在头文件<time.h>中,返回类型是time_t,

通过查询可以知道,返回的time_t其实就是unsigned int

而传入的参数为int类型的指针变量,其实我们只需要传入NULL即可

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
	srand((unsigned int)time(NULL));
		int tmp = rand();
	return 0;
}

测试上面代码可以知道,每次生成的数字都是真正随机的!!

到此,随机数生成的原理就分析完啦!!


补充一句

当你需要的是在一个范围内的随机数,是要对生成的随机数取模既可。

例如上面的代码,如果你要的是1到10的随机数,只需要

ret = (ret % 10+ 1

创作不易,希望大家可以点赞、评论、转发、关注一条龙哦!

你们的支持是我创作最大的动力!!
在这里插入图片描述


点击全文阅读


本文链接:http://zhangshiyu.com/post/31649.html

随机数  函数  生成  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1