C++ 知识量:19 - 82 - 316
在C++中,可以使用标准库中的<random>头文件来生成随机数。这个库提供了多种随机数生成器和分布。
下面是一个简单的例子,展示了如何使用这个库来创建一个随机数引擎类:
#include <random> #include <iostream> class RandomEngine { public: RandomEngine() : gen(rd()) { // 初始化随机数引擎。这里我们使用了时间作为种子。 } int getRandom() { // 返回一个介于0和RAND_MAX之间的随机数 return gen(); } private: std::mt19937 gen; // 使用Mersenne Twister算法生成随机数 std::random_device rd; // 用来获取随机数种子 }; int main() { RandomEngine re; // 创建一个随机数引擎对象 // 输出10个随机数 for (int i = 0; i < 10; ++i) { std::cout << re.getRandom() << std::endl; } return 0; }
这个例子中,创建了一个名为RandomEngine的类,它有一个getRandom方法来生成随机数。在构造函数中,初始化了随机数引擎,使用std::random_device来获取一个随机的种子,然后使用这个种子来初始化std::mt19937引擎。然后,getRandom方法简单地调用了引擎的operator()方法来生成随机数。
在C++中,可以使用标准库中的<random>来生成并管理随机数分布。这个库提供了多种随机数分布,包括均匀分布、正态分布、伯努利分布等。
以下是一个使用均匀分布的简单例子:
#include <random> #include <iostream> int main() { std::random_device rd; // 用来获取随机数种子 std::mt19937 gen(rd()); // 使用Mersenne Twister算法生成随机数 std::uniform_int_distribution<> dis(0, 100); // 定义分布,范围是[0,100] for (int n=0; n<10; ++n) { std::cout << dis(gen) << ' '; } std::cout << '\n'; }
在这个例子中,生成了10个介于0和100之间的随机整数。std::uniform_int_distribution<>定义了随机数的分布,dis(gen)则生成一个随机数。这种方式产生的随机数比C语言中的 rand() 函数产生的随机数更均匀、更随机。
如果想要其他类型的分布,如正态分布,可以用std::normal_distribution<>替换std::uniform_int_distribution<>。例如:
#include <random> #include <iostream> int main() { std::random_device rd; // 用来获取随机数种子 std::mt19937 gen(rd()); // 使用Mersenne Twister算法生成随机数 std::normal_distribution<> dis(0.0, 1.0); // 定义分布,平均值为0.0,标准差为1.0 for (int n=0; n<10; ++n) { std::cout << dis(gen) << ' '; } std::cout << '\n'; }
在这个例子中,生成了10个平均值为0.0,标准差为1.0的正态分布的随机浮点数。
在C++中,可以使用标准库中的 <random> 来生成随机实数。下面是一个示例代码:
#include <iostream> #include <random> int main() { std::random_device rd; // 用来获取随机数种子 std::mt19937 gen(rd()); // 使用Mersenne Twister算法生成随机数 std::uniform_real_distribution<> dis(0.0, 1.0); // 定义分布,范围是[0.0,1.0] for (int n=0; n<10; ++n) { std::cout << dis(gen) << ' '; } std::cout << '\n'; }
这个代码将生成10个介于0.0和1.0之间的随机实数。std::uniform_real_distribution<> 定义了随机数的分布,dis(gen) 则生成一个随机数。这种方式产生的随机数比C语言中的 rand() 函数产生的随机数更均匀、更随机。
要生成非均匀分布的随机数,需要使用不同的分布函数。在C++的<random>库中,提供了多种非均匀分布,如正态分布、泊松分布、指数分布等。
要在C++中生成指数分布的随机数,可以使用std::exponential_distribution。以下是一个简单的示例:
#include <iostream> #include <random> int main() { std::random_device rd; // 用来获取随机数种子 std::mt19937 gen(rd()); // 使用Mersenne Twister算法生成随机数 std::exponential_distribution<> dis(1.0); // 定义分布,参数为1.0 for (int n=0; n<10; ++n) { std::cout << dis(gen) << ' '; } std::cout << '\n'; }
这个代码将生成10个指数分布的随机数,参数为1.0。指数分布是一种连续概率分布,其特征是所有值都具有相同的概率,即它们是“记忆丢失”的。可以根据需要调整参数来改变分布的形状和范围。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6