随机数

目录

一、传统方式:std::rand 和 std::srand

使用方法:

优缺点:

二、现代方式: 库(推荐)

1. 随机整数

2. 随机浮点数

3. 布尔值

4. 字符

5. 正态分布(高斯分布)

6. 离散分布的随机数

7. 随机字符串

8. UUID(通用唯一标识符)

三、std::shuffle:用于打乱序列

四、总结:选择合适的随机数生成方法

一、C++ 中随机数生成的重要性

1. 模拟与建模

例子:

2. 游戏开发

例子:

3. 密码学和安全性

例子:

4. 机器学习与优化算法

例子:

5. 统计分析和实验设计

例子:

二、C++ 中随机数的用途

1. 生成随机整数

用途:

2. 生成随机浮点数

用途:

3. 生成布尔值

用途:

4. 生成随机字符和字符串

用途:

5. 生成正态分布随机数

用途:

6. 生成离散分布随机数

用途:

7. 随机排列(std::shuffle)

用途:

三、总结

随机数的生成在 C++ 中具有以下重要性:


一、传统方式:std::rand 和 std::srand

rand 

srand

在 C++ 标准库中,std::rand() 和 std::srand() 是较早的随机数生成方法,适用于简单的需求。需要注意的是,它们的随机数质量不高,且每次运行程序时,如果没有设置种子,生成的随机数序列是固定的。

使用方法:

/* rand example: guess the number */
#include <stdio.h>      /* printf, scanf, puts, NULL */
#include <stdlib.h>     /* srand, rand */
#include <time.h>       /* time */int main ()
{int iSecret, iGuess;/* initialize random seed: */srand (time(NULL));/* generate secret number between 1 and 10: */iSecret = rand() % 10 + 1;do {printf ("Guess the number (1 to 10): ");scanf ("%d",&iGuess);if (iSecret<iGuess) puts ("The secret number is lower");else if (iSecret>iGuess) puts ("The secret number is higher");} while (iSecret!=iGuess);puts ("Congratulations!");return 0;
}
#include <iostream>
#include <cstdlib>
#include <ctime>int main() {// 设置随机数种子(使用当前时间作为种子)std::srand(static_cast<unsigned int>(std::time(0)));// 生成 0 到 99 之间的随机数int random_number = std::rand() % 100;std::cout << "Random number: " << random_number << std::endl;return 0;
}

优缺点:

  • 优点:简单,适合快速生成随机数。
  • 缺点:随机数的质量较低,容易受到周期限制,难以控制随机数的分布。

二、现代方式:<random> 库(推荐)

random文档

C++11 引入了 <random> 库,提供了比 rand() 更好的随机数生成机制,包括多种分布(均匀分布、正态分布、伯努利分布等)和更复杂的生成器。它的优点是可以生成高质量的随机数,并且能够控制随机数的分布。

所有类型

随机整数
随机浮点数
布尔值
字符
正态分布(高斯分布)
离散分布的随机数
随机字符串
UUID(通用唯一标识符)

1. 随机整数

生成随机数

int main()
{std::random_device rd;//打印结果是随机数std::cout << "Random value: " << rd() << std::endl;return 0;
}

std::random_device      

文档

std::uniform_int_distribution

std::uniform_int_distribution文档

使用 std::uniform_int_distribution 可以生成指定范围内的均匀分布的整数。

std::mt19937的文档 

 mt19937 - C++ Reference (cplusplus.com)

#include <iostream>
#include <random>int main() {std::random_device rd;   // 获取随机数种子std::mt19937 gen(rd());  // 梅森旋转算法生成随机数std::uniform_int_distribution<> dis(1, 100);  // [1, 100] 范围的整数int random_int = dis(gen);std::cout << "Random integer: " << random_int << std::endl;return 0;
}

random_int是1到100的随机数         

2. 随机浮点数

使用 std::uniform_real_distribution 可以生成指定范围内的均匀分布浮点数。

uniform_real_distribution 文档

#include <iostream>
#include <random>int main() {std::random_device rd;std::mt19937 gen(rd());std::uniform_real_distribution<> dis(0.0, 1.0);  // [0.0, 1.0] 范围的浮点数double random_float = dis(gen);std::cout << "Random floating-point number: " << random_float << std::endl;return 0;
}

3. 布尔值

布尔值可以通过生成随机的整数(0 或 1)来实现。

#include <iostream>
#include <random>int main() {std::random_device rd;std::mt19937 gen(rd());std::uniform_int_distribution<> dis(0, 1);  // 生成 0 或 1bool random_bool = dis(gen);std::cout << "Random boolean value: " << (random_bool ? "true" : "false") << std::endl;return 0;
}

4. 字符

通过生成字符的 ASCII 码,再将其转换为字符类型。

#include <iostream>
#include <random>int main() {std::random_device rd;std::mt19937 gen(rd());std::uniform_int_distribution<> dis('A', 'Z');  // [A, Z] 范围的字符char random_char = dis(gen);std::cout << "Random character: " << random_char << std::endl;return 0;
}

5. 正态分布(高斯分布)

std::normal_distribution 可以生成符合正态分布的随机数,适用于模拟许多自然现象。

#include <iostream>
#include <random>int main() {std::random_device rd;std::mt19937 gen(rd());std::normal_distribution<> dis(0.0, 1.0);  // 均值 0,标准差 1 的正态分布double random_normal = dis(gen);std::cout << "Random normal distributed number: " << random_normal << std::endl;return 0;
}

6. 离散分布的随机数

std::uniform_int_distribution 可以用于生成离散值的随机数。例如,模拟掷骰子时生成 1 到 6 之间的随机数。

#include <iostream>
#include <random>int main() {std::random_device rd;std::mt19937 gen(rd());std::uniform_int_distribution<> dis(1, 6);  // [1, 6] 范围的整数int dice_roll = dis(gen);std::cout << "Dice roll: " << dice_roll << std::endl;return 0;
}

7. 随机字符串

通过生成一系列随机字符,可以构造一个随机字符串。

#include <iostream>
#include <random>
#include <string>int main() {std::random_device rd;std::mt19937 gen(rd());std::uniform_int_distribution<> dis('A', 'Z');  // [A, Z] 范围的字符std::string random_string;for (int i = 0; i < 10; ++i) {random_string += dis(gen);}std::cout << "Random string: " << random_string << std::endl;return 0;
}

8. UUID(通用唯一标识符)

虽然 C++ 标准库没有直接支持生成 UUID,但可以使用一些第三方库(如 Boost 或 libuuid)来生成 UUID。

三、std::shuffle:用于打乱序列

std::shuffle 可以用来打乱容器中的元素,通常用于生成随机排列。

#include <iostream>
#include <vector>
#include <algorithm>
#include <random>int main() {std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};std::random_device rd;std::mt19937 gen(rd());std::shuffle(vec.begin(), vec.end(), gen);std::cout << "Shuffled vector: ";for (int num : vec) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

四、总结:选择合适的随机数生成方法

  • **std::rand()**:简单、快速,但质量较低。适用于简单的需求。
  • <random> 库:推荐使用现代的 <random> 库,它提供了更高质量的随机数,并支持多种分布。
  • 分布选择:根据需求选择合适的分布类型(均匀分布、正态分布等)。
  • 随机字符与字符串:通过生成字符的 ASCII 值来生成随机字符或字符串。
  • **std::shuffle**:用于打乱容器元素顺序,常用于生成随机排列。

通过 std::random,C++ 允许开发者根据需求灵活选择随机数生成方式,不仅提供了更高质量的随机数生成,还能更精细地控制生成数值的范围和分布。

在 C++ 中生成随机数是很多应用程序和算法中的重要组成部分。随机数的生成不仅是数学模型、模拟实验、加密技术等领域的核心需求,而且在游戏开发、数据分析、机器学习等多种场景中也有广泛的应用。生成随机数的质量直接影响到程序的准确性、可靠性以及安全性,因此理解其重要性和用途至关重要。

一、C++ 中随机数生成的重要性

1. 模拟与建模

在科学计算和工程中,随机数是很多模拟方法的基础,尤其是在 蒙特卡罗模拟(Monte Carlo Simulation)中,随机数用于通过随机抽样估算复杂问题的解。例如,模拟粒子运动、气候变化、金融市场等都依赖于高质量的随机数生成。

例子:
  • 天气预报:通过模拟不同天气条件下的气象模型,随机数帮助生成可能的天气情景。
  • 金融建模:用随机数生成可能的市场波动情况,从而预测风险。

2. 游戏开发

在游戏开发中,随机数用于生成不可预测的事件和行为,从而增强游戏的娱乐性和重玩性。例如,随机生成关卡、物品掉落、敌人行为等都是基于随机数的。

例子:
  • 随机敌人生成:在角色扮演游戏(RPG)中,敌人的生成是随机的,增加了游戏的挑战性。
  • 随机事件:在策略游戏中,随机事件(如自然灾害、市场波动等)常常改变游戏局势。

3. 密码学和安全性

在 密码学 中,随机数用于生成密钥、初始化向量(IV)、盐值等,以确保加密算法的安全性。加密系统的强度依赖于随机数的质量和不可预测性,因此,使用高质量的随机数是防止安全漏洞的关键。

例子:
  • 生成加密密钥:生成随机的密钥对,以确保加密的安全性。
  • 随机盐值:生成盐值(salt),防止密码破解时的预计算攻击(如字典攻击、暴力破解等)。

4. 机器学习与优化算法

在机器学习中,随机数用于初始化神经网络的权重、选择训练样本、进行随机梯度下降(SGD)等优化算法。随机化可以帮助跳出局部最优解,找到全局最优解。

例子:
  • 随机初始化神经网络权重:避免神经网络收敛到相同的局部最优解。
  • 数据增强:在图像处理任务中,随机旋转、平移、裁剪等操作增加数据多样性,提升模型的泛化能力。

5. 统计分析和实验设计

在统计学中,随机数广泛应用于 随机抽样、 实验设计 和 假设检验 等领域。随机数帮助生成代表性样本,从而推导出准确的统计结果。

例子:
  • 随机抽样:从一个大的数据集中随机选择子集进行分析,以推测总体的特征。
  • 假设检验:通过随机模拟实验来检验统计假设的有效性。

二、C++ 中随机数的用途

1. 生成随机整数

随机整数广泛用于游戏、模拟、加密、统计等多个领域。通过生成均匀分布的整数,可以模拟许多现实世界中的随机现象。

用途:
  • 骰子模拟:生成随机整数,模拟骰子的掷点。
  • 随机生成任务:在任务分配、队列管理等系统中,使用随机数生成任务顺序或队列顺序。

2. 生成随机浮点数

随机浮点数通常用于模拟概率、物理模型、优化问题等。例如,模拟粒子在空间中的分布或生成符合某种分布(如正态分布)的随机数。

用途:
  • 模拟真实世界问题:通过随机浮点数模拟粒子物理、分子动力学、金融市场的波动等。
  • 随机化算法:某些优化算法,如模拟退火(Simulated Annealing)或遗传算法(Genetic Algorithm),会使用随机浮点数来探索解空间。

3. 生成布尔值

布尔值的随机生成广泛应用于决策系统、算法优化等领域。通过生成随机布尔值,可以模拟随机决策或选择。

用途:
  • 概率决策:在机器学习中的某些启发式方法或模拟算法中,通过随机选择布尔值来决定是否执行某些操作。
  • 随机试验:在统计学实验或蒙特卡罗模拟中,使用布尔值模拟成功或失败的事件。

4. 生成随机字符和字符串

生成随机字符或字符串常用于密码生成、验证码生成、测试用例生成等场景。随机字符生成可以用于生成用户的初始密码、随机的用户名等。

用途:
  • 生成验证码:生成随机字符的字符串作为验证码,防止自动化程序攻击。
  • 生成随机密码:用于生成难以猜测的强密码。

5. 生成正态分布随机数

正态分布的随机数用于模拟自然现象、金融数据建模等场景。在金融建模、风险管理、科学模拟等领域,正态分布的随机数是非常常见的。

用途:
  • 金融建模:模拟股票市场的价格变化。
  • 误差建模:许多自然现象的误差都遵循正态分布,如测量误差、噪声等。

6. 生成离散分布随机数

离散分布的随机数通常用于模拟有限的选择范围。例如,模拟掷骰子、抽奖、选择样本等场景。

用途:
  • 抽奖系统:从多个奖项中随机选择获奖者。
  • 选择随机样本:从大量数据中随机抽取若干个样本进行实验分析。

7. 随机排列(std::shuffle

std::shuffle 可以用来打乱容器中的元素,常用于游戏、数据排序等场景。

用途:
  • 洗牌算法:在卡牌游戏中,洗牌时使用 std::shuffle 随机打乱牌组。
  • 数据集重排:在机器学习中,随机重排数据集以提高模型的泛化能力。

三、总结

随机数的生成在 C++ 中具有以下重要性:

  1. 模拟与建模:帮助模拟复杂系统或自然现象,如气候变化、金融市场等。
  2. 游戏开发:增强游戏的随机性和可玩性,如随机生成地图、敌人行为等。
  3. 密码学与安全性:保障数据的安全性,生成密钥、IV 等加密所需的随机值。
  4. 优化与机器学习:用于随机化算法、优化模型和数据增强等。
  5. 统计分析:用于随机抽样、假设检验和实验设计等。

随机数在 C++ 中的用途广泛,涵盖了从简单的数值模拟到复杂的密码学应用等各个领域。了解和使用高质量的随机数生成方法对于提高程序的准确性、安全性和效率至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/471530.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python Plotly 库使用教程

Python Plotly 库使用教程 引言 数据可视化是数据分析中至关重要的一部分&#xff0c;它能够帮助我们更直观地理解数据、发现潜在的模式和趋势。Python 提供了多种数据可视化库&#xff0c;其中 Plotly 是一个功能强大且灵活的库&#xff0c;支持交互式图表的创建。与静态图表…

LeetCode题解:5.最长回文子串【Python题解超详细,中心拓展、动态规划、暴力解法】

题目描述 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 解答 class Solution(object):def longestPalindrome(self, s):""":type s: str:rtype: str"""# 思路一&#xff1a;中心拓展def extend_from_center(left,right):# 从中心向…

企业一站式管理系统odoo的研究——PLM插件的搭建

大纲 1. 环境准备1.1 安装操作系统1.2 更新操作系统1.3 配置用户组和用户1.3.1 创建用户组 odoo1.3.2. 创建用户 odoo1.3.3. 设置用户 odoo 的密码1.3.4. 验证用户和组1.3.5. 将用户 odoo 添加到添加sudo组&#xff1a;1.3.6. 切到odoo用户 2. 安装 Odoo1. 安装依赖项目2.2. 安…

Keil基于ARM Compiler 5的工程迁移为ARM Compiler 6的工程

环境&#xff1a; keil版本为5.38&#xff0c;版本务必高于5.30 STM32F4的pack包版本要高于2.9 软件包下载地址&#xff1a;https://zhuanlan.zhihu.com/p/262507061 一、更改Keil中编译器 更改后编译&#xff0c;会报很多错&#xff0c;先不管。 二、更改头文件依赖 观察…

ABAP开发学习——ST05 ABAP SQL跟踪工具

操作步骤 第一步使用ST05之前&#xff0c;将要查的程序停留想要看的操作的前一步&#xff0c;这里想看到取数操作&#xff0c;所以停留在选择界面 第二步进入ST05 选择SQL Trace 然后激活 第三步去执行程序 第四步ST05取消激活 第五步查看操作 选完时间直接执行

C/C++语言基础--C++模板与元编程系列六,C++元编程相关库的讲解与使用

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 模板与元编程是C的重要特点&#xff0c;也是难点&#xff0c;本人预计将会更新10期左右进行讲解&#xff0c;这是第六期&#xff0c;讲解元编程相关库等&#xff0c;本人感觉这一部分内容还是比较复杂的&am…

uni-app之数据驱动的picker选择器( uni-data-picker)之可以选择到任意级别

背景说明 uni-app 官方的插件市场有数据驱动选择器&#xff0c;可以用作多级分类的场景。本人引入插件后&#xff0c;发现&#xff0c;在h5和微信小程序都只能选择到叶子级。而在给出的官方组件示例中确并非如此。 以选择年级&#xff0c;而不选择班级。然后&#xff0c;想试试…

探索 HTML 和 CSS 实现的蜡烛火焰

效果演示 这段代码是一个模拟蜡烛火焰的HTML和CSS代码。它创建了一个具有动态效果的蜡烛火焰动画&#xff0c;包括火焰的摆动、伸缩和光晕的闪烁。 HTML <div class"holder"><div class"candle"><div class"blinking-glow"&g…

react + ts定义接口类型写法

接口&#xff08;未进行ts定义&#xff09; export async function UserList(params: {// keyword?: string;current?: number;pageSize?: number;},// options?: { [key: string]: any }, ) {return request<API1.UserList>(http://geek.itheima.net/v1_0/mp/artic…

【教程】Ubuntu设置alacritty为默认终端

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 背景介绍 设置教程 注意事项 背景介绍 alacritty是一个开源的终端&#xff0c;比默认的xterm更好看&#xff0c;甚至编辑文本时候还会代码高亮…

使用Element UI实现前端分页,及el-table表格跨页选择数据,切换分页保留分页数据,限制多选数量

文章目录 一、前端分页1、模板部分 (\<template>)2、数据部分 (data)3、计算属性 (computed)4、方法 (methods) 二、跨页选择1、模板部分 (\<template>)2、数据部分 (data)3、方法 (methods) 三、限制数量1、模板部分 (\<template>)2、数据部分 (data)3、方法…

写给初学者的React Native 全栈开发实战班

React Native 全栈开发实战班 亲爱的同学们&#xff1a; 很高兴在这里与大家相聚&#xff01;我是你们的讲师&#xff0c;将带领大家一起踏上 React Native 移动开发的学习之旅。 为什么选择 React Native&#xff1f; 在这个移动互联网时代&#xff0c;App 开发工程师已经…

StarRocks Summit Asia 2024 全部议程公布!

随着企业数字化转型深入&#xff0c;云原生架构正成为湖仓部署的新标准。弹性扩展、资源隔离、成本优化&#xff0c;帮助企业在云上获得了更高的灵活性和效率。与此同时&#xff0c;云原生架构也为湖仓与 AI 的深度融合奠定了基础。 在过去一年&#xff0c;湖仓技术与 AI 的结…

[CKS] K8S Dockerfile和yaml文件安全检测

最近准备花一周的时间准备CKS考试&#xff0c;在准备考试中发现有一个题目关于Dockerfile和yaml文件安全检测的题目。 ​ 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博…

鸿蒙之多选框(Checkbox)

前言&#xff1a; 控制单个或者多个选项的选中状态&#xff0c;就可以使用 多选框组件 Checkbox:多选框组件CheckboxGroup:多选框组&#xff0c;控制多个多选框 Checkbox: 参数CheckboxOptions说明 名称 类型 必填 描述 name string 否 用于指定多选框名称。一般结合Ch…

CSP/信奥赛C++语法基础刷题训练(8):洛谷P5718:找最小值

CSP/信奥赛C语法基础刷题训练&#xff08;8&#xff09;&#xff1a;洛谷P5718&#xff1a;找最小值 题目描述 给出 n n n 和 n n n 个整数 a i a_i ai​&#xff0c;求这 n n n 个整数中最小值是什么。 输入格式 第一行输入一个正整数 n n n&#xff0c;表示数字个数。…

【云原生系列--Longhorn的部署】

Longhorn部署手册 1.部署longhorn longhorn架构图&#xff1a; 1.1部署环境要求 kubernetes版本要大于v1.21 每个节点都必须装open-iscsi &#xff0c;Longhorn依赖于 iscsiadm主机为 Kubernetes 提供持久卷。 apt-get install -y open-iscsiRWX 支持要求每个节点都安装 N…

【C++】string类(附题)

一、为什么学习string类&#xff1f; 1.1 C语言中的字符串 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列 的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&…

前端vue 列表中回显并下拉选择修改标签

1&#xff0c;vue数据列表中进行回显状态并可以在下拉框中选择修改&#xff0c;效果如下 2&#xff0c;vue 页面关键代码 <el-table-column label"审核" align"center" class-name"small-padding fixed-width" prop"status" >&…

Brave127编译指南 Windows篇:部署Node.js(五)

1. 概述 在Brave浏览器的编译过程中&#xff0c;Node.js扮演着关键角色。作为一个建立在Chrome V8引擎之上的JavaScript运行时环境&#xff0c;Node.js为开发者提供了在服务器端执行JavaScript代码的能力。它的非阻塞、事件驱动架构使其特别适合构建高性能、可扩展的网络应用。…