如何operator()(Generator& g, const param_type& params);
使用std::uniform_int_distribution
. 这是我的代码
#include <iostream>
#include <random>
int get_random_int(const int lower_limit, const int upper_limit) {
std::random_device rd{};
std::mt19937 gen{rd()};
static std::uniform_int_distribution<> dist;
// use operator()(Generator& g, const param_type& params);
return dist(gen, lower_limit, upper_limit);
}
int main() {
std::cout << get_random_int(1, 1000000) << std::endl;
}
您需要创建一个类型的对象
param_type
。您可以将名称缩短为
decltype(dist)::param_type
,但我认为语法的可读性并不高。别名也会使其更短、更清晰。隐式构造
{lower_limit, upper_limit}
不起作用:https://godbolt.org/z/4cr3f758K ,尽管我在cppreference中没有看到强制explicit
构造函数的要求。另请注意,操作的昂贵部分是设置随机数引擎(此处
std::mt19937
),而不是分布本身。这样做会更好(也更容易)static
:有点偏离主题,但是您的代码有问题,并且错误的内容被声明为
static
.std::random_device
速度很慢,并且是真正的随机生成器(如果平台支持),它应该只使用一次。当您多次使用此功能时,则不需要std::mt19937
std::mt19937
初始化有点昂贵。这就是你应该做的事情static
。std::uniform_int_distribution
很简单,它只是保存应生成随机值的范围,因此没有必要将其保留为静态,并且在每次调用时创建它非常便宜。所以我会这样修复你的代码:
https://godbolt.org/z/oahEEoM9d
它看起来不像你所要求的,但它以更小的方式完成你需要的事情。
每次调用仅使用随机设备的版本:https://godbolt.org/z/96Yd51hz7
以下是编译器如何优化此类代码的演示:https://godbolt.org/z/rP7vfMoW7(代码已被修剪,以便汇编更易于阅读)。