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

news/2025/1/13 21:47:14/文章来源:https://www.cnblogs.com/2bjiujiu/p/18669490

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

1.1 随机数基本概念:

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

  • 伪随机数生成器(PRNG)

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

2. C++中获取随机数:

2.1 基本流程:

1. 设置随机数种子
1. 获取随机数(整数、浮点数)

2.2 随机数种子来源:

  1. time() 函数
    • 获取当前时间戳,在多线程场景下,由于time函数的精度有限,可能产生相同的种子,生成相似的随机序列
  2. std::random_device
    • 是一个非确定性的随机数源,从操作系统或硬件设备重获取真正的随机信息

2. 3获取随机数:

  1. 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;}
};
  1. 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;}
};
  1. 随机性要求较高使用 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 特点:

  • 长周期
    • Mersenne Twister 的周期通常是 2^19937-1,这是一个巨大的数字,使得生成的随机数序列非常长,能够避免在实际应用中出现周期短导致的重复序列问题
  • 高维均匀分布
    • 生成的随机数在高维空间中具有良好的均匀分布特性,这对于需要多个随机数进行模拟或计算的情况非常重要
  • 随机性质量高
    • 通过复杂的位操作和状态转移函数来产生随机数,克服了一些简单随机数生成器(如线性同余发生器)的缺点,如生成的随机数序列的可预测性和低质量

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

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

相关文章

黑狂野大数据2

--拉链表 --增量导入是没有overwrite 且加载的是最新分区的数据

others_shellcode 1

其实这题直接nc连一下就可以了。其实考的是系统调用来着 32位程序系统调用号用 eax 储存, 第一 、 二 、 三参数分别在 ebx 、ecx 、edx中储存。 可以用 int 80 汇编指令调用。 64位程序系统调用号用 rax 储存, 第一 、 二 、 三参数分别在 rdi 、rsi 、rdx中储存。 可以用 sys…

一篇解决编译原理大作业,基于Flex、Bison设计编译器(含语法分析树和符号表)

1.工具简单介绍 Flex 和 Bison 是编译器开发中常用的两个工具,分别用于生成词法分析器和语法分析器。它们通常一起使用,共同完成源代码的词法分析和语法分析工作。 Flex: Flex通过读取一个规则文件(通常是.l文件),这个文件中定义了一系列的模式和对应的动作。模式用于匹配…

python 删除txt的前三行并保存原文件

数据 #!usr/bin/env python # -*- coding:utf-8 _*- """@author:Suyue @file:raindrop.py @time:2025/01/$ {DAY} @desc: """ def remove_first_three_lines(file_path):# 读取原始文件的所有行with open(file_path, r, encoding=utf-8) as file…

P3586 [POI2015] Logistyka

P3586 [POI2015] Logistyka 题目描述 维护一个长度为 \(n\) 的序列,一开始都是 \(0\),支持以下两种操作:U k a 将序列中第 \(k\) 个数修改为 \(a\)。 Z c s 在这个序列上,每次选出 \(c\) 个正数,并将它们都减去 \(1\),询问能否进行 \(s\) 次操作。每次询问独立,即每次询…

Java编程规范-命名规范

命名风格 抽象类/异常类/测试类 抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类命名以它要测试的类的名称开始,以 Test 结尾。 数组 中括号是数组类型的一部分,数组定义如下:String[] args。 反例: 使用 String args[] 的方式来定义。 POJO…

go序列化库--msgpack

简介 msgpack是一个基于二进制高效的对象序列化类库,可用于跨语言通信。 它可以像JSON那样,在许多种语言之间交换结构对象。 但是它比JSON更快速也更轻巧。 支持Python、Ruby、Java、C/C++、Go等众多语言。 宣称比Google Protocol Buffers还要快4倍。官方的说法它像 JSON, 但…

图灵完备游戏介绍

怎么从软件到硬件 这个问题对于我来说很难理解。即使我本身是程序员,即使看了很多科普视频,但仍然不知道。硬件是不可变的,软件是多变的,怎么用不变实现变化? 我偶然间看了系统推荐的游戏视频,发现了这个游戏。于是就趁着无聊玩了下。这个游戏展现了怎么从硬件到软件。逻…

推荐4款基于.NET开源、功能强大的CMS建站系统

前言 CMS系统作为一种强大的内容管理工具,在数字化时代发挥着越来越重要的作用。无论是个人博客还是大型企业官网,选择一个合适的CMS都能极大地提高效率和用户体验。今天大姚给大家推荐4款基于.NET开源、免费、功能强大的CMS建站系统,希望可以帮助到有需要的同学。 SSCMS SS…

DVWA靶场CSP Bypass (漏洞绕过) 漏洞通关及源码审计

CSP Bypass CSP Bypass(Content Security Policy Bypass)漏洞涉及的是绕过网站部署的内容安全策略(Content Security Policy,CSP)限制,从而执行潜在的恶意操作。CSP 是一种安全机制,用于防止跨站脚本(XSS)、数据注入攻击等。其通过限制网页能够加载和执行的内容来源…

为你的Blazor程序加入本地化多语言功能

本地化 本地化是为给定语言和地区定制应用程序的过程. BootstrapBlazor 组件允许您将其 UI 元素转换为所需的语言。这包括按钮、过滤器操作符属性等文本。组件内部默认使用当前请求 UI 文化语言,本文将向您展示如何在应用程序中使用此功能: BootstrapBlazor 组件库 简介 Boot…