C++中获取随机数的常用方法小结

 更新时间:2025年01月15日 08:25:26   作者:梦_鱼  
这篇文章主要为大家详细介绍了C++中获取随机数的几种常用方法,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解下

1.C++中获取随机数的几种方法

随机数基本概念

随机数:在一定范围内[a, z],每个数出现的概率相等并且无法预测下一个数的数值序列。

伪随机数生成器(PRNG)

  • 原理:由一个状态寄存器和一个更新函数组成,初始状态由种子决定,更新状态会根据当前状态生成下一个状态,并输出一个伪随机数
  • 种子:伪随机数生成器的初始值,决定了随机数开始时的状态,由于随机数基于算法与随机数生成器初始时的状态产生随机序列,因此相同的种子产生完全相同的随机序列

2. C++中获取随机数

2.1 基本流程

设置随机数种子

获取随机数(整数、浮点数)

2.2 随机数种子来源

time() 函数

获取当前时间戳,在多线程场景下,由于time函数的精度有限,可能产生相同的种子,生成相似的随机序列

std::random_device

是一个非确定性的随机数源,从操作系统或硬件设备重获取真正的随机信息

2.3获取随机数

C cstdlib库中rand函数

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

int main() {
    // 设置随机数种子
    std::srand(time(nullptr));
    std::cout << "RAND_MAX" << RAND_MAX << std::endl;
    for (int i=0; i<10;++i) {
        // 获取随机数
        std::cout << "random value: " <<  rand() <<  std::endl;
        // 通过 % 取余获取指定范围的随机数
        std::cout << "random range 1 100: " << rand() % 100 << std::endl;
    }
};

C++ random库 (c++11)

#include <random>
#include <iostream>

int main() {
    // 指定种子
    std::default_random_engine engine(std::random_device{}());
    int count = 10;
    // 指定范围:整数
    std::uniform_int_distribution<int> rand_int_generator(0, 100);
    for (int i=0; i<10; ++i) {
        std::cout << "int random value:" <<  rand_int_generator(engine) << std::endl;
    }
    
    // 指定范围:浮点数
    std::uniform_real_distribution<double> rand_double_generator(0, 1);
    for (int i=0; i<10; ++i) {
        std::cout << "double random value:" <<  rand_double_generator(engine) << std::endl;
    }
};

随机性要求较高使用 std::mt19937作为引擎

#include <random>
#include <iostream>

int main() {
    // 指定种子
    std::mt19937 engine(std::random_device{}());
    int count = 10;
    // 指定范围:整数
    std::uniform_int_distribution<int> rand_int_generator(0, 100);
    for (int i=0; i<10; ++i) {
        std::cout << "int random value:" <<  rand_int_generator(engine) << std::endl;
    }

    // 指定范围:浮点数
    std::uniform_real_distribution<double> rand_double_generator(0, 1);
    for (int i=0; i<10; ++i) {
        std::cout << "double random value:" <<  rand_double_generator(engine) << std::endl;
    }
};

3. Mersenne Twister (马特赛特旋转算法)

3.1工作原理

Mersenne Twister 算法维护一个内部状态向量,这个向量的长度通常为 n个w -bit 的字。对于最常见的 MT19937 版本,n=624且w=32

初始化

首先使用一个种子(可以是任意整数)初始化内部状态向量。通常会对种子进行一些处理,将其扩展到内部状态向量的长度

状态更新

  • 通过一个复杂的位操作函数对状态向量进行更新,这个函数被称为 “twist” 操作。在 MT19937 中,它使用了一系列的移位、异或和与操作,将状态向量中的元素进行混合和更新
  • 经过多次 “twist” 操作,状态向量中的元素会以一种复杂的方式发生变化,保证了下一个随机数的不可预测性

随机数提取

从更新后的状态向量中提取随机数。通常使用一个函数将状态向量中的元素映射到所需的输出范围。例如,对于生成 32 位的随机数,直接使用状态向量中的元素,而对于生成小于 32 位的随机数,则会对状态向量中的元素进行适当的截断或位操作来生成所需的随机数

3.2 特点

1.长周期

Mersenne Twister 的周期通常是 2^19937-1,这是一个巨大的数字,使得生成的随机数序列非常长,能够避免在实际应用中出现周期短导致的重复序列问题

2.高维均匀分布

生成的随机数在高维空间中具有良好的均匀分布特性,这对于需要多个随机数进行模拟或计算的情况非常重要

3.随机性质量高

通过复杂的位操作和状态转移函数来产生随机数,克服了一些简单随机数生成器(如线性同余发生器)的缺点,如生成的随机数序列的可预测性和低质量

到此这篇关于C++中获取随机数的常用方法小结的文章就介绍到这了,更多相关 C++获取随机数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c语言string.h头文件中所有函数示例详解

    c语言string.h头文件中所有函数示例详解

    这篇文章详细介绍了C语言标准库中的字符串和内存操作函数,以str开头的字符串处理函数和以mem开头的内存处理函数,每种函数都有详细的原型、功能描述和示例代码,需要的朋友可以参考下
    2024-11-11
  • 深入理解C语言sizeof()计算空间大小为8的问题

    深入理解C语言sizeof()计算空间大小为8的问题

    本文将介绍C语言中的sizeof()函数,以及如何使用它来计算变量、数据类型和数组在内存中的大小,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • 详解C/C++高精度(加减乘除)算法中的压位优化

    详解C/C++高精度(加减乘除)算法中的压位优化

    在高精度计算中数组的每个元素存储一位10进制的数字,这样的存储方式并不是最优的,32位的整型其实至少可以存储9位高精度数字,数组元素存储更多的位数就是压位优化。本文将展示压位优化的原理以及压9位的实现和性能对比,需要的可以参考一下
    2023-01-01
  • 使用devenv在命令行中编译项目的方法

    使用devenv在命令行中编译项目的方法

    下面小编就为大家分享一篇使用devenv在命令行中编译项目的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • 浅谈Qt实现HTTP的Get/Post请求

    浅谈Qt实现HTTP的Get/Post请求

    本文主要介绍了浅谈Qt实现HTTP的Get/Post请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • C++预处理连接的示例详解

    C++预处理连接的示例详解

    C++预处理连接(Preprocessor Concatenation)是一种宏定义技巧,用于将两个或多个符号(如变量、字符串等)连接成一个符号。这篇文章主要通过一些示例为大家讲解一下预处理连接,需要的可以参考一下
    2023-03-03
  • 基于WTL 双缓冲(double buffer)绘图的分析详解

    基于WTL 双缓冲(double buffer)绘图的分析详解

    本篇文章是对WTL下使用双缓冲(double buffer)绘图进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言快速排序与二分查找算法示例

    C语言快速排序与二分查找算法示例

    这篇文章主要介绍了C语言快速排序与二分查找算法,涉及C语言随机数生成、快速排序及二分查找等算法相关实现技巧,需要的朋友可以参考下
    2018-01-01
  • C语言的各类变量和零值的比较详解

    C语言的各类变量和零值的比较详解

    这篇文章主要为大家介绍了C语言的各类变量和零值的比较,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • 详解C++ 共享数据保护机制

    详解C++ 共享数据保护机制

    这篇文章主要介绍了详解C++ 共享数据保护机制的相关资料,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下
    2021-02-02

最新评论