如何生成随机数+原理详细分析

本文介绍了C++中生成随机数的方法,通过使用rand()函数和srand()函数结合时间戳确保每次运行都能得到不同的随机数。srand()需要在rand()前设置随机数种子,通常使用当前时间戳作为种子以避免重复。此外,还探讨了如何生成指定位数的随机数,例如通过取余数生成两位或三位随机数。
摘要由CSDN通过智能技术生成

说到如何生成一个随机数,可能当你百度后会看到这样一段代码。

srand((unsigned int)time(NULL));
int ret = rand();

那么一个随机数到底是如何生成的呢?我相信善于探索的你一定想知道这其中的原理,那么话不多说,进入正题把!
一个随机数到底是如何生成的:
说到生成随机数我们都知道要用到一个rand函数,那么这个函数究竟是如何运用的呢,我们可以打开MSDN看看这个函数的用法
在这里插入图片描述
这里的第一句说到rand函数会返回一个从0到RAND_MAX的整型,那么RAND_MAX的值是多少呢,我们可以将它复制到编译器中然后选中它右击鼠标点击转到定义,就可以看到这句话
在这里插入图片描述
其实RAND_MAX的值也就是0x7fff,转换为十进制也就是32767,所以说rand函数可以随机生成一个0到32767的整型,当你在编译器中尝试时,你会看到
在这里插入图片描述
当你天真的以为你已经成功的可以生成随机数的时候,你会发现当年再次运行该代码时,它生成的还是这些随机数,也就是第一次运行代码时代码生成了随机数,但是第二次运行时会生成相同的随机数。
这时我们应该想起对rand函数的描述中还有第二句话:在调用rand函数之前,我们要使用srand函数设置生成随机数的起点。我们又在MSDN中查查srand函数:
在这里插入图片描述
我们可以看到srand函数的参数是一个无符号整型并且无返回值,那么这时我们可以来测试一下,就随便给一个无符号整型传给srand函数
在这里插入图片描述
但是当我们再次执行程序时照样还是这些随机数,当我们把传入srand函数的改变时,发现所给随机数便改变了:
在这里插入图片描述
所以我们只要在每次执行程序的时候给srand函数传入一个与上一次不同的数即可,但是我们就是要生成一个随机数,现在又需要一个随机数,这不成死循环了吗?
这时我们想到在电脑上有一个东西是时刻在发生着变化的,那就是时间,这时我们需要介绍一个概念,那就是时间戳。
时间戳: 当前时间与计算机起始时间的差值,单位是秒。
计算机的起始时间:1970-01-01 08:00:00
在这里插入图片描述
每一秒的时间戳都不一样,所以我们只要把时间戳传入srand函数即可,这时我们就需要用到time函数,因为time函数的返回值就是时间戳。
在这里插入图片描述
这里我们可以看到time函数的参数是time_t型指针,返回值是time_t型,这里的time_t我们也可以把它放到编译器中右击鼠标,点击转到定义:
在这里插入图片描述
这里我们可以看到,其实time_t就是int型被typedef重定义了(也就是起了个别名)而已。
而我们也不需要向time函数传入什么指针,于是我们就向time函数传入一个空指针( NULL)即可,也就是time( NULL),但是srand函数的参数是unsigned int型,所以我们如果要将time函数的返回值传入srand函数,那么我们就需要将time函数的返回值强制性转化会unsigned int型,也就是( unsigned int )time( NULL),所以我们最终将代码写为:
在这里插入图片描述
这样,每次运行代码时所得到的就是真正意义上的随机数了。
如何生成规定位数的随机数:
生成两位随机数:
在这里插入图片描述
我们只需要将所得随机数对90取余数,那么我们得到的数就是0-89的数字,这时再加上10便是10-99的数字了。
生成三位随机数:
在这里插入图片描述
道理与生成两位随机数相同我就不再阐述了。

至于文章中用到的MSDN,如果博友们没有也可以搜索http://www.cplusplus.com。也可以查看相关函数的信息。

  • 16
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2021dragon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值