首页 > 代码库 > C++ 随机数
C++ 随机数
由随机数分布类、随机数引擎类组成。
现在介绍生成整数与浮点数的随机数。
头文件<random>,使用的随机数引擎类是std::default_random_engine,可通过()调用运算符返回随机数,简单的例子:
// main.cpp #include <iostream> #include <random> using std::cout; using std::ends; int main() { std::default_random_engine e; for (int i = 0; i < 10; ++i) { cout << e() << ends; } return 0; }
此处有个问题,此处返回的随机数是相同的,因为没有设置种子数。
// main.cpp #include <iostream> #include <random> #include <ctime> using std::cout; using std::ends; int main() { std::default_random_engine e(time(nullptr)); // 设置种子数 for (int i = 0; i < 10; ++i) { cout << e() << ends; } return 0; }
此时可生成不同的随机数,如果在生成随机数之前时差超过1秒则随机率高。同样可通过e.seed(value)设置种子数,种子为整型类型。
如果要指定范围可使用随机数分布类uniform_int_distribution,该类是模板类,有均匀分布功能:
// main.cpp #include <iostream> #include <random> #include <ctime> using std::cout; using std::ends; int main() { std::default_random_engine e(time(nullptr)); // 设置种子数 std::uniform_int_distribution<unsigned> u(0,9); // 设置类型为无符号整型,范围为[0,9] for (int i = 0; i < 10; ++i) { cout << u(e) << ends; // 生成0-9的随机数 } return 0; }
在以下的例子,随机数是一致的:
// main.cpp #include <iostream> #include <random> #include <ctime> using std::cout; using std::ends; using std::endl; int func() { std::default_random_engine e; std::uniform_int_distribution<unsigned> u(0,9); // 设置类型为无符号整型,范围为[0,9] for (int i = 0; i < 10; ++i) { cout << u(e) << ends; // 生成0-9的随机数 } return 0; } int main() { for (int i = 0; i < 10; ++i) { func(); cout << endl; } return 0; }
因为default_random_engine每次都更新,每次的分布类推动是相似的,因此随机数是一致的,可使用静态类型解决该问题:
// main.cpp #include <iostream> #include <random> #include <ctime> using std::cout; using std::ends; using std::endl; int func() { static std::default_random_engine e; // 数据数引擎静态类型 std::uniform_int_distribution<unsigned> u(0,9); // 设置类型为无符号整型,范围为[0,9] for (int i = 0; i < 10; ++i) { cout << u(e) << ends; // 生成0-9的随机数 } return 0; } int main() { for (int i = 0; i < 10; ++i) { func(); cout << endl; } return 0; }
此处是静态类型,因此使用的是同一个随机数引擎静态类型,没有更新同时在分布类里不断推动,则产生的随机数是不同的。
在上处例子是整型,如果使用浮点类型double、float等则编译错误。产生浮点数随机数,使用随机数分布类uniform_real_distribution,该类是模板类,产生浮点随机数,如果使用整型类型unsigned等会产生编译错误:
// main.cpp #include <iostream> #include <random> #include <ctime> using std::cout; using std::ends; using std::endl; int func() { static std::default_random_engine e; // 数据数引擎静态类型 std::uniform_real_distribution<double> u(0,1); // 设置类型为双精度浮点数,范围为[0,1] for (int i = 0; i < 10; ++i) { cout << u(e) << ends; // 生成0-9的随机数 } return 0; } int main() { for (int i = 0; i < 10; ++i) { func(); cout << endl; } return 0; }
使用随机数分布类和随机数引擎类,可使用不同的功能,如均匀分布、正态分布,同时产生整数、浮点数等随机数。
以上是C++11新标准引入的随机数简单介绍,欢迎大家一起交流分享。
本文出自 “zmh009” 博客,请务必保留此出处http://zmh009.blog.51cto.com/11619347/1894125
C++ 随机数