房地产网站欣赏,合肥电信网站备案,网站服务器 内容更新,晋城市住房和城乡建设局官方网站2023年8月16日#xff0c;周三晚上
写了1个半小时 目录
概述英文文档什么是mt19937什么是状态大小头文件std::mt19937的常用成员函数1. 构造函数#xff1a;2. 种子操作函数#xff1a;3. 随机数生成函数#xff1a;4. 辅助函数#xff1a;生成种子值方法1#xff1a;使…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
#includeiostreamint main() {std::random_device rd; // 创建一个std::random_device对象unsigned int seed rd(); // 生成一个随机的种子值std::mt19937 engine(seed); // 使用随机的种子值创建一个伪随机数生成器std::coutengine();return 0;
}
方法2使用时间戳
可以使用C标准库中的std::chrono库来获取当前的时间戳并将其转换为整数形式作为种子值。
#include chrono
#include random
#include iostreamunsigned int generateSeedFromTimestamp() {auto now std::chrono::system_clock::now(); // 获取当前时间点auto timestamp std::chrono::duration_caststd::chrono::milliseconds(now.time_since_epoch()); // 转换为毫秒级的时间戳return static_castunsigned int(timestamp.count()); // 将时间戳转换为整数种子值
}int main() {unsigned int seed generateSeedFromTimestamp(); // 生成种子值std::mt19937 engine(seed); // 使用种子值初始化伪随机数生成器std::coutengine();return 0;
} 举例说明
#include chrono
#include random
#includeiostreamint 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;
}