随机数

目录

一、传统方式: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.xdnf.cn/news/15970.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

生物信息入门软件安装(保姆级教程)

写在开头 大四期间&#xff0c;选修了一门智慧医疗的课程&#xff0c;期末考核为25分钟有关智慧医疗方面的汇报。一次偶然的课程汇报让我接触到了生物信息&#xff0c;也产生了浓厚的兴趣&#xff0c;同时加入了老师的研究生小组&#xff0c;开启了这段生物信息学习的旅途。至此…

数据智能新纪元:向量数据库驱动AI大模型创新

数据智能新纪元&#xff1a;向量数据库驱动AI大模型创新 前言向量数据库与AI大模型的关系以及发展现状向量数据库的技术创新与落地实践向量数据库的未来趋势与产业机遇 前言 最近和一位搞AI创业的朋友聊天&#xff0c;他说了句意味深长的话&#xff1a;“当所有人都在谈论大模型…

2024 Visual Studio Code的下载与安装

目录 一、Windows系统下载与安装二、macOS系统下载与安装三、Linux系统下载与安装四、启动与配置VS Code 以下是2024年Visual Studio Code&#xff08;简称VS Code&#xff09;的下载与安装步骤&#xff0c;适用于Windows、macOS和Linux系统&#xff1a; 一、Windows系统下载与…

利用TinyML和IoT技术预测沙漠地区光伏电站清洁方法

论文标题 英文标题&#xff1a;Predictive method for cleaning photovoltaic plants in desert areas using TinyML and IoT technique 作者信息 A. Mellit, M. Chourouk&#xff1a;Faculty of Science and Technology, Renewable Energy laboratory, University of Jijel…

P3372 【模板】线段树 1

luoguP3372 【模板】线段树 1 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; 将某区间每一个数加上 k k k。求出某区间每一个数的和。 输入格式 第一行包含两个整数 n , m n, m n,m&#xff0c;分别表示该数列数字的个数和操作…

Enigma Virtual Box封装客户端

1.输入可执行程序&#xff0c;另外命名输出可执行程序的输出程序。如图&#xff1a; 2.添加附带文件 这些文件包括可执行程序的库、文件、插件等。 如图&#xff1a;(这里包括文件或者文件夹) 3.点击process生成可执行文件 生成的执行文件可以放在桌面上单独运行。

Unity自动LOD工具AutoLOD Mesh Decimator的使用

最近在研究大批量物体生成&#xff0c;由于我们没有专业美术&#xff0c;在模型减面工作上没有人手&#xff0c;所以准备用插件来实现LOD功能&#xff0c;所以找到了AutoLOD Mesh Decimator这个插件。 1&#xff0c;导入插件后&#xff0c;我们拿个实验的僵尸狗来做实验。 空…

VMware彻底官宣免费!杀疯了!

话说最近这几个月&#xff0c;几家软件大佬这是怎么了&#xff0c;这怎么还开始卷免费了呢&#xff08;手动doge&#xff09;。 众所周知&#xff0c;就在上个月的时候&#xff0c;Jetbrains 刚官宣其旗下 WebStorm 和 Rider 两款软件开始对非商业用途全面免费&#xff0c;当时…

QML —— 拖拽测试 - 文本图片跑马灯Demo(附源码)

效果 说明 此代码可对文本及图片进行托转并放入被置方框内,在放置的文本框或图片框发生变化后,跑马灯也会在下一次运行时内容发生变化。 代码 main.qml import QtQuick 2.9 import QtQuick.Window 2.2 import QtQuick.Controls 2.0 import QtQuick.Layouts 1.14 import QtQu…

CDGA|企业数据治理:实务知识与理论思考的深度融合探索

在当今这个数据驱动的时代&#xff0c;企业数据已成为推动业务增长、优化决策制定和塑造竞争优势的关键因素。然而&#xff0c;随着数据量的爆炸性增长&#xff0c;如何有效管理和利用这些数据&#xff0c;确保数据的准确性、安全性与合规性&#xff0c;成为企业面临的一大挑战…

乐观锁和悲观锁的区别 使用 使用场景 | 图解

图解乐观锁和悲观锁的区别 & 实现 & 使用场景 文章目录 图解乐观锁和悲观锁的区别 & 实现 & 使用场景悲观锁synchronized 与 ReentrantLock 乐观锁CAS 机制版本号机制原子类 总结两种锁各自的使用场景 悲观锁 悲观主义者&#xff0c;认为这个资源不上锁&#x…

Linux初步引言(0)

文章目录 前言一、发展史UNIX发展史Linux发展史 二、开源精神三、Linux内核官网四、企业应用现状在服务器领域的发展在桌面领域的发展在移动嵌入式的发展Linux在云计算/大数据领域的发展 五、众多的发行版本DebianUbuntuCentOSKail Linux 六、何为操作系统&#xff1f;总结 前言…

Linux: C语言发起 DNS 查询报文

本文目录 使用 getaddrinfo()手动构造 DNS 查询报文DNS 查询部分&#xff08;Question Section&#xff09;QNAME (查询的域名)QTYPE (查询类型)QCLASS (查询类)Answer Section (答案部分) C语言代码发起 DNS 查询报文 使用 getaddrinfo() getaddrinfo() 是一个高层的接口&…

【Pytorch】神经网络介绍|激活函数|使用pytorch搭建方法

神经网络 神经网络介绍 概念 神经网络 人工神经网络ANN 也称神经网络NN 是一种模仿生物神经网络结构和功能的计算模型人脑可以看作是一个生物神经网络,由众多神经元连接而成,神经网络可以看作是模拟生物神经元的过程 输入层 input Layer: 输入x的那一层 输出层 output Laye…

【HarmonyOS NEXT】实战——登录页面

【HarmonyOS NEXT】实战——登录页面 在本文中&#xff0c;我们将深入探讨如何使用HarmonyOS NEXT来实现一个功能完备的登录页面。通过这个实战案例&#xff0c;你将结合页面布局、数据本地化存储、网络请求等多方面了解到HarmonyOS NEXT在构建现代应用时的强大能力和灵活性。…

iscc2023

iscc 还没想好名字的塔防游戏 就是那句话首字母&#xff0c;加上玩游戏通关后有提示就是后面的字母 Flask中的pin值计算 先f12&#xff0c;看到base64到路由/getusername 输入app.py&#xff0c;得到路由/crawler 进入后发现是一个计算&#xff0c;写一个python脚本 impor…

力扣-Mysql-3328-查找每个州的城市 II(中等)

一、题目来源 3328. 查找每个州的城市 II - 力扣&#xff08;LeetCode&#xff09; 二、数据表结构 表&#xff1a;cities ---------------------- | Column Name | Type | ---------------------- | state | varchar | | city | varchar | ----------------…

Vue2:组件

Vue2&#xff1a;组件 非单文件组件定义注册使用 单文件组件 组件是Vue中最核心的内容&#xff0c;在编写页面时&#xff0c;将整个页面视为一个个组件&#xff0c;再把组件拼接起来&#xff0c;这样每个组件之间相互独立&#xff0c;有自己的结构样式&#xff0c;使页面编写思…

力扣 LeetCode 28. 找出字符串中第一个匹配项的下标(Day4:字符串)

解题思路&#xff1a; KMP算法 需要先求得最长相等前后缀&#xff0c;并记录在next数组中&#xff0c;也就是前缀表&#xff0c;前缀表是用来回退的&#xff0c;它记录了模式串与主串(文本串)不匹配的时候&#xff0c;模式串应该从哪里开始重新匹配。 next[ j - 1 ] 记录了 …

计算机网络 (1)互联网的组成

一、互联网的边缘部分 互联网的边缘部分由所有连接在互联网上的主机组成&#xff0c;这些主机又称为端系统&#xff08;end system&#xff09;。端系统可以是各种类型的计算机设备&#xff0c;如个人电脑、智能手机、网络摄像头等&#xff0c;也可以是大型计算机或服务器。端系…