当前位置:首页 » 《随便一记》 » 正文

【C++】详解用标准库的std::mt19937生成随机数

8 人参与  2024年03月06日 08:26  分类 : 《随便一记》  评论

点击全文阅读


2023年8月16日,周三晚上

写了1个半小时


目录

概述英文文档什么是mt19937什么是状态大小头文件std::mt19937的常用成员函数1. 构造函数:2. 种子操作函数:3. 随机数生成函数:4. 辅助函数:生成种子值方法1:使用std::random_device方法2:使用时间戳举例说明

概述

英文文档

std::mersenne_twister_engine - cppreference.com

https://cplusplus.com/reference/random/mt19937/

什么是mt19937

std::mt19937是C++标准库中的一个伪随机数生成器类,它实现了梅森旋转算法(Mersenne Twister)。mt19937类是一个随机数引擎,可以生成高质量的伪随机数序列。

A Mersenne Twister pseudo-random generator of 32-bit numbers with a state size of 19937 bits.

一个有着19937位状态大小的能够生成32位数的梅森旋转伪随机生成器

什么是状态大小

状态大小(state size)指的是在随机数生成器中用于存储和更新内部状态的位数或字节数。随机数生成器的状态是一个关键的组成部分,它影响着生成的随机数序列的质量和性能。

状态大小越大,生成的随机数序列的周期(即重复之前经过的步骤数)通常越长,这意味着生成的随机数更不容易重复。较大的状态大小还可以提供更好的统计特性和更高的随机性。

状态大小的选择通常需要权衡随机性和性能之间的关系。较大的状态大小可能需要更多的内存和计算资源来存储和更新状态,可能会影响性能。因此,在选择状态大小时需要综合考虑应用的需求、可用资源和随机性要求。

对于std::mt19937而言,它使用19937位的状态大小,这是一个较大的状态大小,可以提供较长的周期和较好的随机性特性。

头文件

使用mt19937需要包含<random>头文件。

std::mt19937的常用成员函数

1. 构造函数:

 mt19937():默认构造函数,使用默认的种子初始化随机数引擎。 mt19937(unsigned int seed):使用指定的种子初始化随机数引擎。

2. 种子操作函数:

 seed():设置种子值为默认值。 seed(unsigned int seed):设置新的种子值。

3. 随机数生成函数:

 operator():生成一个32位的随机整数。

4. 辅助函数:

 discard(unsigned long long z):等同于执行z次operator(),以丢弃z次生成的随机数。 min():获取可生成的最小随机数值。 max():获取可生成的最大随机数值。

生成种子值

方法1:使用std::random_device

std::random_device是C++标准库中的一个类,它通常被用作生成伪随机数生成器的种子,以提供更高质量的随机性。

#include <chrono>#include <random>#include<iostream>int main() {std::random_device rd; // 创建一个std::random_device对象unsigned int seed = rd(); // 生成一个随机的种子值std::mt19937 engine(seed); // 使用随机的种子值创建一个伪随机数生成器    std::cout<<engine();  return 0;}

方法2:使用时间戳

可以使用C++标准库中的std::chrono库来获取当前的时间戳,并将其转换为整数形式作为种子值。

#include <chrono>#include <random>#include <iostream>unsigned int generateSeedFromTimestamp() {  auto now = std::chrono::system_clock::now(); // 获取当前时间点  auto timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()); // 转换为毫秒级的时间戳  return static_cast<unsigned int>(timestamp.count()); // 将时间戳转换为整数种子值}int main() {  unsigned int seed = generateSeedFromTimestamp(); // 生成种子值  std::mt19937 engine(seed); // 使用种子值初始化伪随机数生成器  std::cout<<engine();  return 0;}

举例说明

#include <chrono>#include <random>#include<iostream>int main() {std::random_device rd; // 创建一个std::random_device对象unsigned int seed = rd(); // 生成一个随机的种子值std::mt19937 engine(seed); //使用随机的种子值创建一个伪随机数生成器    engine.seed(rd());//给engine设置一个新的种子值    std::cout << "最小值:" << engine.min() << std::endl; // 输出最小值std::cout << "最大值:" << engine.max() << std::endl; // 输出最大值std::cout << "生成一个随机数:" << engine() << std::endl; // 输出最大值engine.discard(5);return 0;}


点击全文阅读


本文链接:http://zhangshiyu.com/post/74431.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 娇宠祁总的小作精改清冷人设了续集(娇宠祁总的小作精改清冷人设了)终极反转(黎枕眠祁斯砚)全篇一口气阅读
  • 妻子带我***我转头娶了她姐姐(陆歧宋喻)全书浏览_妻子带我***我转头娶了她姐姐全书浏览
  • 女友装穷送我学乖,我反手曝光她恶行全文+后续_苏雨袁章裴怀结局+番外_小说后续在线阅读_无删减免费完结_
  • 她说脏了的男人就该沉塘沈时微陆星沉番外(沈时微陆星沉)TXT+后续+结局在线阅读
  • (头条)惨死新婚夜,真嫡女虐翻全侯府小说(奚衍文鸯)整本免费版阅读无广告(惨死新婚夜,真嫡女虐翻全侯府)
  • 完结文顾谨言桑谕在线品鉴列表_完结文顾谨言桑谕在线品鉴
  • 苏娆时砚清林若浅免费苏娆时砚清林若浅免费免费
  • 沈云染陆承瑾续集(沈云染陆承瑾)全本完整免费版_起点章节+后续(沈云染陆承瑾)
  • 全文他在永夜长眠番外+后续老书虫(苏娆时砚清林若浅)列表_全文他在永夜长眠番外+后续老书虫
  • 他在永夜长眠林若浅免费+结局(苏娆时砚清林若浅)_他在永夜长眠林若浅免费+结局苏娆时砚清林若浅
  • 重生后我把社交账号送给丑女,贫困生急了精修版_***富豪苏沫全文+后续_小说后续在线阅读_无删减免费完结_
  • 手术台上,院长丈夫让小情人在我身上练手新鲜出炉_苏曼顾屿晓晓爽文_小说后续在线阅读_无删减免费完结_

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1