C++随机数

2023-05-16

C++随机数

C++提供了两个函数,用于返回随机数:rand() 和 srand()

rand()

功能: 随机数发生器

用法:

// #include<stdlib.h>
int rand(void)

rand()的内部实现是用线性同余法做的,简单的讲就是通过类似于一个数学周期函数去生成一个数字。而这个周期又特别的长,所以在一定范围内可以看成是随机的。故单独使用rand()生成的随机数实际上是伪随机数。

当用户未设定随机数种子时,系统会默认随机数种子为1。随机数种子可以简单地理解成上面提到的数学周期函数的参数。

因为rand() 产生的是伪随机数字,每次执行时是相同的“周期函数”; 若要不同, 可以用函数 srand() 初始化它。换个简单的理解方式:srand()就是给“周期函数”添加了一个参数。

srand()

功能:

初始化随机数发生器

用法:

// #include<stdlib.h>
void srand(unsigned int seed)
    
/*
unsigned:无符号
表示抛弃数据类型的负数部分,将更多的存储空间用来存放非负数
例如:int类型原本占用4字节空间,即只能存储[-2^16,2^16 - 1]范围内的数据
加unsigned后存储数据的范围就是[0,2^32 - 1]

unsigned int表示[0,2^32 - 1]范围内的整型
*/

srand() 用来设置 rand() 产生随机数时的随机数种子。参数 seed 必须是个整数,如果每次 seed 都设相同值,rand() 所产生的随机数值每次就会一样。所以想要生成指定数量的随机数,就需要在每次使用rand()都使用srand()重新产生一个随机数种子。

使用time()作为随机数种子

功能:

时间戳,返回从1970年1月1月零点零分零秒到当前时间的秒数

用法:

// #include<time.h>
time_t time(time_t * t);    // 指针t用于存放返回的时间,可以传空指针

我们可以将time返回的时间作为参数传递给srand(),因为程序每一次运行时,我们的时间都是不一样的,即每次运行时的随机数种子都不一样。

srand((unsigned)time(NULL));
rand();

随机数范围计算

首先我们可以通过rand() % n的方式,获取到[0,n)的随机数,因为任何一个数除以n得到的余数0到n-1。那么我们就可以通过改变n的值就可以去指定截止数,再将取到的范围加上一个值就可以改变起始数:

要取得 [a,b) 的随机整数,使用 (rand () % (b-a))+ a;
要取得 [a,b] 的随机整数,使用 (rand () % (b-a+1))+ a;
要取得 (a,b] 的随机整数,使用 (rand () % (b-a))+ a + 1;

要取得 0~1 之间的浮点数,可以使用 rand () /double (RAND_MAX)。

#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;

int main() {
    // 生成随机数种子
    srand((unsigned)time(NULL));
    
    // RAND_MAX 是 rand() 函数能够产生的最大随机数
    cout << "RAND_MAX:" << RAND_MAX << endl;
    
    int a = 1, b = 10;
    // 生成[a,b)的随机数
    cout << (rand() % (b-a)) + a << endl;
    
    // 生成[a,b]的随机数
    cout << (rand() % (b-a+1)) + a << endl;
    
     // 产生(a, b] 的随机数,可以使用(rand() % (b - a)) + a + 1;
 	cout << (rand() % (b - a)) + a + 1 << endl;
    
    // 产生[0, 1] 的浮点数,可以使用 rand() / double(RAND_MAX);
 	cout << rand() / double(RAND_MAX) << endl;
    
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++随机数 的相关文章

  • 安装Anaconda3后缺失大量文件的解决方法:安装旧的版本再升级

    项目场景 xff1a 安装Anaconda3 项目场景 xff1a 安装Anaconda3后缺失大量文件 问题描述 安装Anaconda3后缺失大量文件 正确安装后的样子 xff1a 原因分析 xff1a 找了很多帖子 xff0c 也尝试了
  • IOS开发 汉化

    UIImagePicker TZImagePicker选择图片时默认是英文 只需要修改xcode本地设置即可 xff0c 具体操作如图示 1 选择info 2 添加Localizations 3 将English改成Chinese 2 iO
  • WSL2 Linux搭建xfce4桌面和使用xrdp远程连接

    基于Ubuntu20 04测试 1 安装 span class token function sudo span apt span class token function install span xfce4 xrdp y 如果遇到下面页
  • 修改 WSL2 可用内存大小和交换分区大小

    WSL2默认可以使用的内存大小为主机的80 对于Linux而言即使装了桌面 一般的开发也没必要给这么多内存 分多了 反而有可能卡主机的Windows 操作 1 打开Windows资源管理器 地址栏输入 UserProfile 回车 在该目录
  • C++代码: Linux下获取基本设备信息

    测试环境 基于C 43 43 20构建测试 g 43 43 10 2 1 CMakeLists txt 设置用于构建该项目的最低cmake版本 cmake minimum required VERSION 3 1 设置项目名称和编程语言 p
  • VMware虚拟机Ubuntu无法使用摄像头的问题

    注 之前我在使用Ubuntu的虚拟机中 搞OpenCV开发 需要使用摄像头 遇到了摄像头无法使用的问题 后面折腾了很久才发现 USB3 1 兼容设置的问题 刚才又用新的虚拟机配置环境 又遇到了之前的问题 因此做个记录 1 摄像头未连接到虚拟
  • 一文搞懂光纤的方方面面

    光纤 一直以为光纤模块会非常贵 xff0c 呃 xff0c 只能说没有想象中的贵 xff0c 相比网线还是贵上不少 一个常见的光纤系统通常会包括收发器 xff0c 光电转换器还有光纤收发器 通常简单的入门级一套下来可能也在200 300左右
  • msys2配置cmake构建环境

    注 本人主要在Linux下搞开发 使用msys2是为了方便移植部分程序到Windows下 做以下纪录方便环境配置 1 换源 span class token comment 更新本地软件数据库 span pacman Sy 2 安装开发工具
  • Windows 10安装 WSL2 (Ubuntu 20.04)

    条件 对于 x64 系统 xff1a 版本 1903 或更高版本 xff0c 采用 内部版本 18362 或更高版本 对于 ARM64 系统 xff1a 版本 2004 或更高版本 xff0c 采用 内部版本 19041 或更高版本 低于
  • Ubuntu 20.04 server 切换中文语言

    1 安装区域设置 locales Ubuntu 一般是预装了的 Kali Linux 和 Debian可能没有 就需要安装 更新索引 sudo apt update span class token comment 安装locales sp
  • 全新安装的Termux配置Ubuntu环境

    基于 Termux 0 101 测试 换国内源 默认官方源在国外速度慢 有梯子的话也可以不换 这里换清华源为例 更多 执行命令 span class token function sed span i span class token st
  • 1g 路由器使用

    前言 xff08 1 xff09 首次使用以及断网后配置都可参看本文 xff08 2 xff09 简谈 xff0c 创翼实际登录拨号的账号其实并不是 电话 64 cqit xff0c 而是在这个账号前面根据拨号时间生成一个随机字符串 xff
  • 基于随机森林的手写数字识别 (OpenCV)

    OpenCV 4 5 1 C 43 43 20 Ubuntu 20 04 素材 来源 基于 K近邻博文 中原5000个手写数字得到的按行排列的手写数字数据以及对应行的标签 保存为图片后直接放到这里使用 避免重复数据处理 右键图片另存为 行数
  • 使用支持向量机分类 (OpenCV)

    OpenCV 4 5 1 C 43 43 20 Ubuntu 20 04 素材 像素点和分类标签 组态档 设置用于构建该项目的最低cmake版本 cmake minimum required VERSION 3 1 设置项目名称和编程语言
  • 退出该博客平台声明

    试用c s d n快三个月了 xff0c 最不满的就是审核的问题 1 我自己写的东西因为有误修改了一下再提交就说我的博文已有相似的 xff0c 审核不通过 xff0c 不止一次 2 反而好奇有人抄了我的却发出去了 这应该是最后一次在这里发文
  • CMake Error at CMakeLists.txt:11 (find_package): Found package configuration file: /home/luw

    参考资料 xff1a https www cnblogs com newneul p 8364924 html CMake Error at CMakeLists txt 11 find package Found package conf
  • LPC1768学习笔记

    LPC1768学习笔记 xff1a IAP升级 1 需求 xff1a 通过串口给主机升级 xff0c 主机的通信串口与升级串口相同 2 方法 xff1a 要完成APP与IAP程序的切换判断 xff0c 我们需要一个flag update单独
  • 手把手教你如何实现一个简单的数据加密算法

    0 前言 之前写过一篇关于MD5摘要算法的文章 xff0c 很多老铁说能否出一篇关于加密的文章吗 xff1f C语言实现MD5 xff0c 竟如此简单 xff01 一口君的字典里没有 34 不行 34 这两个字 xff01 必须安排 xff
  • python压缩包安装方式

    下载压缩包 从python官网下载embed package xff08 嵌入式包 xff09 解压并进入到解压目录 xff0c 看到python exe为止 下载pip依赖 下载https bootstrap pypa io get pi
  • setup写在script标签中

    快捷键 vb3s 父组件 xff1a span class token tag span class token tag span class token punctuation lt span template span span cla

随机推荐