考虑到下面的接口
EasyRandom<unsigned int> prng(a, b);
auto x = prng(); // scalar
auto v = prng(10); // vector我写了下面的课:
// https://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution
template <typename T = unsigned int>
class EasyRandom
{
private:
std::random_device rd;
std::unique_ptr<std::mt19937> gen;
std::unique_ptr<std::uniform_int_distribution<T>> dist;
public:
EasyRandom(T a, T b)
{
gen = std::make_unique<std::mt19937>(rd());
dist = std::make_unique<std::uniform_int_distribution<T>>(a, b);
}
T operator()() { return (*dist)(*gen); }
std::vector<T> operator()(size_t n)
{
std::vector<T> v;
for (; n > 0; v.push_back(operator()()), --n);
return v;
}
};我还有几个具体问题:
EasyRandom的方法?operator()(size_t n)更改为返回任何用户指定的SequenceContainer (例如向量、列表、deque),而不是将其硬编码到特定的实现(例如std::vector)?发布于 2019-06-18 05:02:08
gen和dist不需要成为指针。只需将它们声明为成员,并使用构造函数中的成员初始化程序列表来初始化它们。
std::random_device rd;
std::mt19937 gen;
std::uniform_int_distribution<T> dist;
EasyRandom(T a, T b): gen(rd()), dist(a, b) {
}在返回向量的operator()中,可以为向量预留空间,以避免插入(v.reserve(n))期间的内存重新分配。虽然ints没有问题,但如果使用emplace_back而不是push_back,则可以避免非简单类型的值的潜在额外副本。
第二个问题与主题无关(代码未实现)。
https://codereview.stackexchange.com/questions/222495
复制相似问题