由随机数分布类、随机数引擎类组成。
现在介绍生成整数与浮点数的随机数。
头文件<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新标准引入的随机数简单介绍,欢迎大家一起交流分享。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有