【rand】C++ 随机函数

过完年啦,我又回来啦~ 呜呜呜不想上班,这个月居然什么节假日都没有呜呜呜……感觉常用的数据结构总结得差不多了,今天来单独写一下随机函数。


前言

关于随机函数有意思的是,计算机的随机并不是我们传统意义上理解的随机。比如你让我说一个100以内的随机数,那我可能会说“12”,因为这是个我喜欢的数字,你说“再来一个”,我可能又会说“59”,为什么呢?我就是随口一说,这就叫随机嘛。
但是计算机不同,你对它说“产生一个100以内的随机数”,它返回一个值“84”,你再执行一次,它又返回“84”,执行100次,它还是返回84。为什么呢?因为计算机又没有自己喜欢的数字,它不会随口一说,它只是运算一个随机函数,所谓函数,当自变量不变,计算结果一定不变,这是函数的基本性质之一。那么如何让计算机产生真正的随机数呢?


一、rand() 随机函数

1.来一个随机数

首先,random函数不是ANSI C标准,不能在gcc,vc等编译器下编译通过,所以我们用C++下的rand函数来实现。rand()的默认范围是0-2147483647,如果我们需要特定范围的随机数,那么就要对rand()的结果做一点小手脚。

//产生一个1-100范围内的随机数
int n = rand()%100+1;

将结果对100取模,得到的范围就缩小到了0-99,再加1,就得到了我们要的1-100的范围,同理我们可以通过不同的方法处理结果,来得到不同要求的随机数。

2.来10个随机数

//产生10个1-100范围内的随机数
for(int i=0;i<10;i++)
	cout<<rand()%100+1<<",";

//结果:84,87,78,16,94,36,87,93,50,22,

在这里有的朋友可能会产生一点小问题(没错这个朋友就是我自己),我们稍后再讨论。

二、srand()设置种子

在前言里提到的“执行100次,它还是返回84”,是怎么回事呢?毕竟计算机只是一个忠实的执行者,rand()函数产生的结果并不是“随口一说”,而是根据一个值,我们称之为种子(seed),对它进行一系列#¥%@*&^$操作得到的,也就是说产生的“随机数”本质还是一个计算结果,如果“种子”不变,计算结果也一定是固定的。

关于种子的默认值,有说默认值为1的,也有说每次计算机启动后会有一个默认值的。默认值为1好像是对的,重启我没试,毕竟工作用的电脑不到我离职是不能关机的哈哈哈哈哈(bushi)

通常我们用time(0)来设置种子,时间函数time(NULL)会返回从1970年1月1日至今所经历的时间(以秒为单位),也就是说只要不在同一秒内执行,种子就不同,运行结果也就不同了。注意:使用time函数要加头文件#include<time.h>

srand(time(NULL));  //设置随机数种子,time的参数不重要
for(int i=0;i<10;i++)
	cout<<rand()%100+1<<",";

//结果:33,38,47,40,69,85,95,24,19,27,

哎那么问题来了,刚才我没设置种子的时候,连续产生的10个随机数怎么是不同的呢?不知道有没有人跟我有同样的疑问,反正这个问题我翻了好多讲rand()函数用法的博客都没找到答案,最后还是看了实现原理才明白。

https://blog.csdn.net/Cashey1991/article/details/45042291/

在连续调用rand()函数的时候,第一个数来自“种子”(如果没有设置就是默认种子),而从第二个数开始,不再使用原来的种子,而是把前一个生成的随机数作为新的种子。比如第一个随机数是由默认种子“1”生成的84,那么在计算第二个随机数的时候,种子就变成了“84”,以此类推。所以在同一次运行中,产生的随机数是不同的。

我自己试了一下,好像也不是直接用上一个随机数作为种子,可能还要做什么处理,那我就不知道了……总之是用已生成的随机数序列修改种子。

总结

随机函数本质还是由公式生成的,或许某一天人工智能会发展到计算机可以“随口一说”一个随机数吗?那就距离真正的智能不远了吧。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值