2023年8月16日,周三晚上
写了1个半小时
目录
std::mersenne_twister_engine - cppreference.com
https://cplusplus.com/reference/random/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需要包含
std::random_device是C++标准库中的一个类,它通常被用作生成伪随机数生成器的种子,以提供更高质量的随机性。
#include
#include
#include
int main() {
std::random_device rd; // 创建一个std::random_device对象
unsigned int seed = rd(); // 生成一个随机的种子值
std::mt19937 engine(seed); // 使用随机的种子值创建一个伪随机数生成器
std::cout<
可以使用C++标准库中的std::chrono库来获取当前的时间戳,并将其转换为整数形式作为种子值。
#include
#include
#include
unsigned int generateSeedFromTimestamp() {
auto now = std::chrono::system_clock::now(); // 获取当前时间点
auto timestamp = std::chrono::duration_cast(now.time_since_epoch()); // 转换为毫秒级的时间戳
return static_cast(timestamp.count()); // 将时间戳转换为整数种子值
}
int main() {
unsigned int seed = generateSeedFromTimestamp(); // 生成种子值
std::mt19937 engine(seed); // 使用种子值初始化伪随机数生成器
std::cout<
#include
#include
#include
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;
}