0

0

c++如何生成随机数_c++ random库随机数生成教程【示例】

穿越時空

穿越時空

发布时间:2026-02-11 14:51:08

|

829人浏览过

|

来源于php中文网

原创

rand()不该再用,因其随机数质量差、范围窄(0~32767)、模运算有偏差;应改用C++11 库,组合引擎(如std::mt19937)与分布(如std::uniform_int_distribution),确保高质量、可复现、无偏移的随机数生成。

c++如何生成随机数_c++ random库随机数生成教程【示例】

为什么 rand() 不该再用了

因为 rand() 生成的随机数质量差、范围窄(通常仅 0~32767),且无法控制分布类型。C++11 引入的 库才是现代标准做法,它分离了随机数引擎和分布,更可控、更可复现、也更符合统计需求。

常见错误是直接用 std::random_device 当作“随机数发生器”反复调用——它本意是熵源,可能耗尽或被系统限制调用频次;真正该反复调用的是封装好的引擎(如 std::mt19937)。

  • 不要写 std::random_device{}() 多次来生成多个数
  • 不要用 rand() % N 模拟范围——会产生偏差,尤其当 RAND_MAX 不是 N 的整数倍时
  • 种子只设一次,通常用 std::random_device 初始化引擎,而非每次生成都重播种子

生成 [1, 100] 区间整数的正确写法

核心是组合一个引擎(如 std::mt19937)和一个分布(std::uniform_int_distribution):

#include 
#include 

int main() {
    std::random_device rd;                     // 熵源,只用一次
    std::mt19937 gen(rd());                    // 引擎,可重复调用
    std::uniform_int_distribution dis(1, 100); // 闭区间 [1, 100]

    for (int i = 0; i < 5; ++i) {
        std::cout << dis(gen) << '\n';  // 每次调用 dis(gen) 生成一个数
    }
}

注意:dis(1, 100) 是包含两端的闭区间,不是左闭右开;若需 [0, N),写成 dis(0, N-1) 是错的,应写 dis(0, N-1)?不,应写 dis(0, N-1)?等等——正确写法是 std::uniform_int_distribution(0, N-1) 表示 [0, N−1],所以 [0, N) 就等价于 [0, N−1],前提是 N 是整数。

立即学习C++免费学习笔记(深入)”;

性能上,std::mt19937rand() 快且质量高;若对性能极端敏感(如高频仿真),可考虑 std::minstd_rand 或复用同一个 gen 实例,避免重复构造。

AI Agent
AI Agent

AIAgent.app 是一个可以让你使用AI代理来完成各种任务的网站,有效提升创造生产力

下载

生成浮点随机数:小心 uniform_real_distribution 的边界

std::uniform_real_distribution 默认生成的是 [0.0, 1.0) 区间(左闭右开),不是 [0.0, 1.0]。这是 IEEE 浮点语义决定的——闭区间在浮点下难以严格实现,标准选择保守定义。

  • 要 [a, b):用 std::uniform_real_distribution(a, b)
  • 要 [a, b](数学闭区间):通常靠缩放+截断容忍,或改用整数分布再除以大常量(如 dis(0, 1000000)/1000000.0
  • 引擎状态影响结果:同一 gen 实例连续调用 dis(gen),结果确定且可复现——这对调试和单元测试很关键

若误写成 std::uniform_real_distribution(0.0, 1.0) 并期望能取到 1.0,会永远失败。这不是 bug,是设计使然。

如何让随机序列可复现(用于测试/调试)

std::random_device 换成固定种子即可:

std::mt19937 gen(42); // 固定种子 42
std::uniform_int_distribution dis(1, 6);
std::cout << dis(gen) << '\n'; // 每次运行都输出相同序列

这比依赖系统熵源更适合自动化测试。但注意:不同编译器或标准库版本对同一引擎+种子产生的序列**不一定完全一致**(尤其跨平台),若需绝对可移植,得自己实现或使用已知行为的第三方引擎(如 PCG)。

真正容易被忽略的是:分布对象(dis)本身不保存状态,状态全在引擎里;所以可以安全地在函数内定义分布,但引擎最好复用或传入,避免频繁重建开销。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1547

2023.10.24

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

688

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

556

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

193

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

206

2025.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

193

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

104

2025.10.23

PHP 命令行脚本与自动化任务开发
PHP 命令行脚本与自动化任务开发

本专题系统讲解 PHP 在命令行环境(CLI)下的开发与应用,内容涵盖 PHP CLI 基础、参数解析、文件与目录操作、日志输出、异常处理,以及与 Linux 定时任务(Cron)的结合使用。通过实战示例,帮助开发者掌握使用 PHP 构建 自动化脚本、批处理工具与后台任务程序 的能力。

49

2025.12.13

Rust异步编程与Tokio运行时实战
Rust异步编程与Tokio运行时实战

本专题聚焦 Rust 语言的异步编程模型,深入讲解 async/await 机制与 Tokio 运行时的核心原理。内容包括异步任务调度、Future 执行模型、并发安全、网络 IO 编程以及高并发场景下的性能优化。通过实战示例,帮助开发者使用 Rust 构建高性能、低延迟的后端服务与网络应用。

1

2026.02.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.1万人学习

C 教程
C 教程

共75课时 | 4.6万人学习

C++教程
C++教程

共115课时 | 17万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号