c++随机数

2023-05-16

计算机的运行是通过代码来进行的,而代码的执行需要确定的数字,即计算机的运行过程是一个确定的过程,计算机的运行过程是一个确定的过程,所以不可能产生一个真正有意义的数字,即计算机只能产生伪随机数

引用随机数需要引用头文件

#include <cstdlib>

1.随机数函数
(1) c++提供产生随机数的函数:
rand(),原型为:int rand(void);
rand() 产生一个 [0…RAND_MAX] 之间的数字,RAND_MAX是可以产生的最大随机数(2^31-1),是一个常量:

  #define RAND_MAX Ox7FFF

(2) 使用:
生成[0…max-1]之间的随机数:

  rand()%max    //这个表达式会生成[0..max-1]之间的随机数

2.随机数种子
直接使用rand()确实可以产生随机数,但是有一个问题:发现每一次 rand()产生的都是同一个值,不信你试试:

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
   cout<<rand()<<endl;
    return 0;
}

这就和我们所说的随机数种子有关了。

种子函数:srand(seed);原型为:void srand(unsigned seed);

如果我们在使用 rand()之前 ,如果不写srand(seed),那么就会默认调用 srand(1),这就是问题所在:
rand()看似是产生一个随机数,但是实际上就是rand()在一个固定的数字序列不断取值生成所谓的随机数,而这个数字序列是由srand(seed)产生,数字序列的数字大小和排序由seed确定,只要seed相同,生成的随机数列就是一样的。

比方说,我执行10次rand()

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
    return 0;
}

发现输出结果都是一样的。

41
18467
6334
26500
19169
15724
11478
29358
26962
24464

这就说明在我的电脑里 srand(1)产生的数字序列就是
41
18467
6334
26500
19169
15724
11478
29358
26962
24464
…… ……
当然,不同的电脑可能是不一样的。
当产生一个序列之后,只要不更新队列,每调用一次rand(),rand()就会从上到下依次取值给程序使用,但是若途中调用srand(seed)更新队列,rand()就会从新队列的头再开始依次向下取值。
eg:

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl<<endl;
   srand(1);
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
    return 0;
}

输出:

41
18467
6334
26500
19169

41
18467
6334
26500
19169

过程分析:
在这里插入图片描述
3.产生真正的随机数

根据前面的说明我们知道,需要再让seed动起来才能产生近似随机的伪随机数。
所以我们可以使用系统的时间来做种子,系统的时间是不断变化的,符合我们更菜的要求。
系统的时间获取:time(NULL),单位是s
它的头文件是:

#include <ctime>

eg:

#include <cstdlib>
#include <ctime>
#include <iostream>

using namespace std;
const int maxs=10;

int main()
{
        srand(time(NULL));
      for (int i=0; i<=10; ++i)
    {
        cout<<rand()%maxs<<endl;
    }
    return 0;
}

第一次运行

17717
21613
1852
28959
371
10155
11222
1420
9654
23944
19598

第二次运行

17894
12203
16245
17658
302
25591
15455
7187
16544
19629
11611

发现是不一样的数据。

4.问题
执行如下代码

#include <cstdlib>
#include <ctime>
#include <iostream>

using namespace std;

int main()
{
      for (int i=0; i<=10; ++i)
    {
        srand(time(NULL));
        cout<<rand()<<endl;
    }
    return 0;
}

发现执行结果是一样的数据

18299
18299
18299
18299
18299
18299
18299
18299
18299
18299
18299

这是因为srand(seed)每执行一次就更新一次数字序列,并且将rand()的指向放在序列首部;而程序的运行效率很快,不到1s就执行完循环,seed还没来的及改变,每次产生的数字序列一样,所以每个rand都是取序列首部数据,就是一样的了。
所以说还是不能真正地完全实现随机数的产生。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++随机数 的相关文章

  • 嵌入式linux文件系统打包的方法

    1 squashfs 打包方式 xff1a mksquashfs rootfs 输入文件加 rootfs squashfs 输出文件名 comp xz 2 jffs2 打包方式 xff1a mkfs jffs2 o jffs2 img 输出
  • Linux系统中/dev/mtd与/dev/mtdblock的区别

    MTD memory technology device内存技术设备 是用于访问memory设备 xff08 ROM flash xff09 的Linux的子系统 MTD的主要目的是为了使新的memory设备的驱 动更加简单 xff0c 为
  • Linux系统安装wireshark

    wireshark是一个我们用来抓包的好帮手 xff0c 使用它可让我们看到端口数据变化 xff08 tcp http等都可以 xff09 xff0c 如接收 发送甚至是我们每个操作命令如何传递 xff0c 都可以通过wireshark来截
  • A Simple Framework for Contrastive Learning of Visual Representations[论文学习] SimCLR

    We simplify recently proposed contrastive self supervised learning algorithms without requiring specialized architecture
  • 一文读懂机器学习,大数据/自然语言处理/算法全有了...

    From http www cnblogs com subconscious p 4107357 html 作者 xff1a 计算机的潜意识 在本篇文章中 xff0c 我将对机器学习做个概要的介绍 本文的目的是能让即便完全不了解机器学习的人
  • the Contextual Loss论文理解

    Maintaining Natural Image Statistics with the Contextual Loss 2018 https github com roimehrez contextualLoss http cgm te
  • OpenStack octavia 详解

    一 Octavia架构分析 具体架构图请参考 xff1a https docs openstack org octavia latest reference introduction html 组件分析 xff1a Octavia API
  • Squid中的日志出现TCP_CLIENT_REFRESH_MISS的问题排除

    http www php oa com 2008 07 15 tcp client refresh miss html 今天检查Squid发现大量的日志出现TCP CLIENT REFRESH MISS 见到Cacti中的流量 xff0c
  • 三种方法教你如何在 Ubuntu 20 上安装 WoeUSB

    三种方法教你如何在 Ubuntu 20 上安装 WoeUSB 知乎 上次给大家分享开源软件的时候说过 xff0c 我们公司所有的电脑安装都是ubuntu系统 工作中使用的所有软件都是免费开源的项目 今天我们测试兼容性的时候需要一台windo
  • IIC总线的时钟同步和总线仲裁

    IIC简介 xff1a IIC 即Inter Integrated Circuit 集成电路总线 xff09 xff0c 这种总线类型是由飞利浦半导体公司在八十年代初设计出来的 xff0c 主要是用来连接整体电路 ICS xff0c IIC
  • ubuntu中如何使用中文输入法

    今天我的一个小朋友问我 xff0c 如何在ubuntu中使用中文 xff0c 对于一个初入门的人来说 xff0c 这确实是一个好的问题 xff0c 我看了一下我的系统 xff0c 竟然也不能输入中文哎 我也老搞一下 首先 xff0c 要先下
  • MySQL查看配置文件my.ini或my.conf路径

    查看配置文件my ini或my conf路径 select 64 64 basedir 查看文件存储路径 select 64 64 datadir
  • linux安装软件报错:有未能满足的依赖关系

    一 问题描述 解决了上一个问题 另外一个进程已经为 dpkg 状态数据库 加锁 又一个问题接踵而来 xff08 真是深得命运宠爱呀 xff09 二 问题分析 很明显 xff0c 这不是重启能解决的问题了 xff0c 继续向命运抗争吧 1 依
  • 用Bootstrap写一份简历

    以前学习Bootstrap时练手用的 分享给大家 注意Bootstrap相关文件的路径 xff0c Bootstrap依赖jQuery xff0c 需要先加载jQuery Github代码链接 xff1a 链接 如果有点小用 xff0c 求
  • Linux创建新环境

    Linux的环境操作 1 下载anaconda2 conda导出环境3 conda创建新环境4 pip创建和导出新环境5 pytorch版本安装6 通过通道安装cpython7 通过SCP指定对方端口传输文件8 释放服务器中的缓存 1 下载
  • 【树莓派】树莓派开放WiFi热点

    树莓派4B上创建WiFi热点 xff08 真实可用 xff09 第一步 xff1a 给树梅派4B刷写系统 xff0c 我用的是目前最新的官方系统 xff0c 镜像名称为2021 01 11 raspios buster armhf img
  • Python爬虫攻略(1)>使用Requests获取LOL游戏攻略

    申明 xff1a 本文对爬取的数据仅做学习使用 xff0c 不涉及任何商业活动 xff0c 侵删 Python爬虫教程 gt 1 使用Requests获取LOL游戏攻略 前戏 如果你想先了解一下什么是爬虫 建议看一下这篇文章 学习爬虫前你需
  • Linux下gitee的使用—— 一看就懂得操作

    在做基于ds18b20温度监控的项目开始时 xff0c 就一直在使用git仓库 xff0c 一直没有写过博客 xff0c 基于今天家里没事 xff0c 刚好可以写一下git版本控制的使用 xff01 废话不多说 xff0c 上教程 xff0
  • 文献阅读2:Deep Video Super-Resolution Network

    Deep Video Super Resolution Network Using Dynamic Upsampling Filters Without Explicit Motion Compensation 隐式运动补偿的动态上采样滤波
  • 形参和实参

    形参和实参的区别 形参出现在函数定义中 xff0c 在整个函数体内都可以使用 xff0c 离开该函数则不能使用 实参出现在主调函数中 xff0c 进入被调函数后 xff0c 实参变量也不能使用 形参和实参的功能是作数据传送 发生函数调用时

随机推荐

  • centos 连接windows远程桌面方法

    目录 1 下载并安装软件nux dextop release rpm 2 安装rdesktop软件 3 远程windows桌面 4 rdesktop退出全屏模式 1 下载并安装软件nux dextop release rpm wget ht
  • Winpcap教程(高级应用)

    循序渐进学习使用WINPCAP xff08 五 xff09 WinPcap或libpca最强大的特点之一就是数据流的过滤引擎 它提供一种高效的方法来只捕获网络数据流的某些数据而且常常和系统的捕获机制相集成 过滤数据的函数是pcap comp
  • linux/ubuntu取消sudo输入密码的办法

    Linux Ubuntu sudo不用输入密码的方法 通常我们并不以root身份登录 xff0c 但是当我们执行某些命令 command 时需要用到root权限 xff0c 我们通常都是用 34 sudo command 34 来执行com
  • verilog通过中+:与-:解决变量内固定长度数据位的动态选取

    在FPGA设计过程 xff0c 尤其是算法实现时hi xff0c 有时往往需要选取某个变量的动态范围地址 xff0c 而verilog中常规的向量标识方法a MSB LSB 往往会发生错误 xff0c 在此可借用a BASE WIDTH 的
  • IDEA配置Hadoop插件

    一 安装插件 1 1搜索的方式安装 xff1a setting中找到plugins插件 xff0c 然后搜索big Data 如下图 xff1a 如果找不到可以修改几个配置试一下 xff1a 如果还是不行 xff0c 你可以在cmd里面 p
  • linux的进程突然没有了

    这几天在linux服务器上跑实验 xff0c 进程占用的空间比较大 xff0c 而且占用的时间也比较长 xff0c 有时候会发现进程突然没有了 这个时候去翻了翻系统的内核日志 xff0c var log 路径下会有一个kern log的日志
  • IDEA建hadoop项目

    一 新建项目project 选择maven xff1b 填写maven的坐标 xff0c groupId xff0c artifactId xff0c 以及 version xff0c 其中groupId是公司域名的反写 xff0c 而ar
  • OpenWRT路由器-中继模式下无线接入

    本文主要介绍刷入了OpenWRT系统的路由器如何作为二级路由器 xff0c 通过wifi接入上一级路由以及发出wifi供本局域网下的设备连接 二级路由器可以增强现有的信号 现在的路由器一般都是双频路由器 xff0c 双频路由器往往是两块网卡
  • XSS(Reflected) 反射型跨站攻击

    今天我学习一下反射型XSS 打开DVWA网站 xff0c 先切换到low级别 xff0c 选择XSS xff08 Reflected xff09 先查看其源代码 xff1a lt php header 34 X XSS Protection
  • Notepad++离线安装NppFTP

    文章目录 第一步 下载第二步 安装第三步 重启Notepad 43 43 后即可使用 第一步 下载 下载地址 xff1a https github com ashkulz NppFTP releases 选择对应版本解压 xff0c x86
  • nested exception is com.microsoft.sqlserver.jdbc.SQLServerException

    今天在写一个数据库语句的时候 xff0c 出现了一个错误 xff0c 话不多说 xff0c 上图 nested exception is com microsoft sqlserver jdbc SQLServerException 仅当使
  • 一文搞懂SpringSecurity,spring-security配置文件详解,史上最全

    一 认证和授权概念 1 在生产环境下我们如果不登录系统是否能对业务进行操作 xff1f 答案显然是否定的 xff0c 要操作这些功能必须首先登录到系统才可以 2 是不是所有用户 xff0c 只要登录成功就都可以操作所有功能呢 xff1f 答
  • map.computeIfAbsent() 详解

    computeIfAbsent 1 首先会判断map中是否有对应的Key xff1b 2 1 如果没有对应的Key xff0c 则会创建一个满足Value类型的数据结构放到Value的位置中 xff1b 2 2 如果有对应的Key xff0
  • SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能

    Spring Security 一 简介 Spring Security是Spring家族中的一个安全管理框架 xff0c 一般Web应用都需要 认证 和 授权 认证 xff1a 验证当前访问系统的是不是本系统的用户 xff0c 并且要确认
  • Java一维数组与二维数组的转换

    准备 现有一个一维数组 xff1a 1 2 3 4 5 6 7 8 9 转为 3 3 的二维数组 xff1a 1 2 3 4 5 6 7 8 9 我们不难看出 xff1a 一维数组第1个元素在数组中为 arr 0 0 一维数组第3个元素在数
  • 采用JSP+Servlet+JDBC完成的一个产品信息管理系统

    项目架构 项目整体采用 xff1a Maven 43 Servlet 43 JSP 43 JDBC 43 bootstrap 43 javascript完成 数据库表设计 t manager 管理员ID 用户名 密码 manager id
  • Python并发学习

    Python并发 1 多进程 和多线程的方式类似 2 多线程 2种编写方式 2 1 submit方式2 2 map方式 3 异步 xff08 协程 xff09 3 1 调用方式3 1 1 在协程函数里去调用协程3 1 2 在非协程函数里去调
  • 动态规划思想《从入门到放弃》

    动态规划的定义 将原问题拆解成若干子问题 xff0c 同时保存子问题的答案 xff0c 使得每个子问题只求解一次 xff0c 最终获得原问题的答案 动态规划的一般流程 例子1 xff1a 一维空间的动态规划 题目 xff1a 求斐波那契数列
  • ubuntu如何输入中文

    右上角设置 gt 区域与语言 gt 输入源 gt 点击 43 号添加 中文 xff08 智能拼音 xff09
  • c++随机数

    计算机的运行是通过代码来进行的 xff0c 而代码的执行需要确定的数字 xff0c 即计算机的运行过程是一个确定的过程 xff0c 计算机的运行过程是一个确定的过程 xff0c 所以不可能产生一个真正有意义的数字 xff0c 即计算机只能产