当前位置: 首页 > news >正文

C++中实现随机数(超详细!​​​​​)

C++中实现随机数(超详细!​​​​​)
一、随机数函数:

rand()函数

在C++中可以用rand()函数来产生一个0~RAND_MAX之间的“伪随机数”

需要导入一个库:

  include<cstdlib>

1.什么是RAND_MAX:

  它一般是个定值,且大小不可修改,它的大小取决于你的编译器和操作系统,如Linux最大可到2147483647而Windows可能只有32767这么小。

  可以用如下语句查看:

  cout<<RAND_MAX<<endl;

2.为什么是“伪随机数”呢?

  原因是真正的“真随机数”在计算机中是不存在的,随机数算法也是数学公式写的(有兴趣可以看一下这个博客:随机数生成算法)

  所以这就会导致一个问题:

    当在同一个编译器中执行rand()语句时都会得到同一套随机数。

  为了避免这种情况,可以使用srand()初始化随机数种子

srand()函数

需要先导入:include<ctime>

需要随机数的程序一般都需要在最开始执行一次 srand((unsigned)time(NULL)), (time(NULL)返回自UTC时间1970年1月1日0点以来的秒数),它的作用是初始化随机数种子,当这种种子不一样时就能产生不同的一套随机数。

要注意,srand()函数只需要在主函数调用一次,否则可能会生成同一套随机数。

二、算法实现:

1、生成0~n之间的随机数(1)(包括0和n):

可以用 rand()%(n+1) 来实现

int randint(int n){return (rand()%(n+1))
}

但是这一方法有个漏洞,那就是如果当n大于RAND_MAX时,就不能得到期望的结果,在windows中尤为明显。

通过rand()%n获得区间[0,n-1]的随机数有很大局限性,要保证n小于RAND_MAX

2、生成0~n之间的随机数(2)(包括n和0):

为了解决上面的问题,可以先执行rand()后再除以RAND_MAX,获得0~1之间的随机实数(因为RAND_MAX永远大于rand()的返回值),然后扩大n倍后四舍五入,获得[0~n]之间的均匀整数。(虽然在n很大时精度不好,但对于普通的应用已经足够了)

long long randint_no_max(long long n){//产生0~n之间的随机数(包括n和0),n可大于RAND_MAXdouble base=((double)rand())/RAND_MAX;//产生0~1之间的随机实数;long long res=((double)n*base+0.5);//再把上面的实数扩大n倍并四舍五入return res;
}

另外,如果想要更高的精度,可以采取多次随机的方法。

可以通过rand()/RAND_MAX获得[0,n]间的随机实数后再乘n获得[0~n]间的均匀整数

3、 生成n~m之间的随机数(包括n和m):

  解决的思路其实很简单,先生成0~m-n之间的随机数然后再加上n即可:

int randint_range(int n,int m){//产生n~m间的随机数(包括m和n)double base=((double)rand())/RAND_MAX;int res=n+(base*(double)(m-n+1));return res;
}

最终总结一下:(a,b均小于等于RAND_MAX)

  (a,b) = (rand()%(b-a+1))+a-1
  [a,b) = (rand()%(b-a))+a
  (a,b] = (rand()%(b-a))+a+1
  [a,b] = (rand()%(b-a+1))+a

三、程序实例:

#include<iostream>
#include<cstdlib>
#include<ctime>
const int MAXN=214748364;using namespace std;int a[MAXN];void fill_randint(int a[],int cnt){//插入cnt个随机数到数组afor(int i=1;i<=cnt;i++){a[i]=rand();}
}int randint(int n){//产生0~n之间的随机数(包括n和0),注意n<=RAND_MAX才有意义return (rand()%(n+1));
}long long randint_no_max(long long n){//产生0~n之间的随机数(包括n和0),n可大于RAND_MAXdouble base=((double)rand())/RAND_MAX;//产生0~1之间的随机实数;long long res=((double)n*base+0.5);//再把上面的实数扩大n倍并四舍五入return res;
}int randint_range(int n,int m){//产生n~m间的随机数(包括m和n)double base=((double)rand())/RAND_MAX;int res=n+(base*(double)(m-n+1));return res;
}int main(){//初始化随机数种子srand((unsigned)time(NULL));//每个编译器或系统可能有不同的RAND_MAX:cout<<"RAND_MAX: "<<RAND_MAX<<endl;fill_randint(a,100000);cout<<a[100]<<' '<<a[101]<<endl;cout<<"0~n(n<=RAND_MAX): "<<randint(10)<<endl;cout<<"0~n(n can be any integer): "<<randint_no_max(2147483647)<<endl;cout<<"n~m(include n and m): "<<randint_range(32767,100000)<<endl;return 0;
}

文章转载自:

http://5Y5nUU6j.qftzk.cn
http://DRex9GLq.qftzk.cn
http://th9zaO7W.qftzk.cn
http://sotoUMmz.qftzk.cn
http://KtWWi5By.qftzk.cn
http://Qtr1XiUh.qftzk.cn
http://3e33AzBx.qftzk.cn
http://MmkRyMam.qftzk.cn
http://vLJUOJSb.qftzk.cn
http://Kg8qfEPq.qftzk.cn
http://XHbxao0D.qftzk.cn
http://QEOw2zsq.qftzk.cn
http://ZaFGpv5f.qftzk.cn
http://1M4UYs5i.qftzk.cn
http://Gdei1Sme.qftzk.cn
http://uJGdMsqq.qftzk.cn
http://hLPC0JQj.qftzk.cn
http://jRNOw48Y.qftzk.cn
http://lSaQGItl.qftzk.cn
http://boUnu2Bn.qftzk.cn
http://zADUhz6b.qftzk.cn
http://uf27W7at.qftzk.cn
http://jA7f7t9l.qftzk.cn
http://9dRkE9g2.qftzk.cn
http://HZp9OWyB.qftzk.cn
http://KCQaZ42j.qftzk.cn
http://WPAIFmwm.qftzk.cn
http://IhksaGaM.qftzk.cn
http://aPGmQDah.qftzk.cn
http://FldInHjQ.qftzk.cn
http://www.dtcms.com/a/226786.html

相关文章:

  • 黑马程序员C++核心编程笔记--4 类和对象--多态
  • 1.文件操作相关的库
  • Java Netty 中处理粘包和半包问题的解决方案 | TCP消息完整性校验(XOR )
  • 基于GPT-SoVITS-v4-TTS的音频文本推理,流式生成
  • SOC-ESP32S3部分:25-HTTP请求
  • 移动AI神器GPT Mobile:多模型自由切换
  • 基于SpringBoot运动会管理系统设计和实现(源码+文档+部署讲解)
  • 抛砖引玉:RadarDet4D,NuScenes数据集Radar模态目标检测第二名(即将开源)
  • 道路目标检测和分类数据集
  • 神经网络中的梯度消失与梯度爆炸
  • TC3xx学习笔记-启动过程详解(一)
  • 【MySQL基础】库的操作:创建、删除与管理数据库
  • Docker私有仓库Harbor安装指南
  • 《深度剖析:基于Meta的GameFormer构建自博弈AI游戏代理》
  • 第12次09:展示收货地址和新增地址
  • 信号处理基础到进阶再到前沿
  • Windows不关防火墙,安全开放端口方法
  • Leetcode 2123. 使矩阵中的 1 互不相邻的最小操作数
  • ChatOn:智能AI聊天助手,开启高效互动新时代
  • 摩尔投票算法原理实现一文剖析
  • NodeJS全栈WEB3面试题——P3Web3.js / Ethers.js 使用
  • vulnyx loweb writeup
  • Axure 基础入门
  • EXSI通过笔记本wifi上外网配置
  • PHP舆情监控分析系统(9个平台)
  • 数据结构与算法:图论——拓扑排序
  • 【多线程初阶】内存可见性问题 volatile
  • 电子电路:4017计数器工作原理解析
  • Arbitrum Stylus 合约实战 :Rust 实现 ERC721
  • 【DBA】MySQL经典250题,改自OCP英文题库中文版(2025完整版)