gpt4 book ai didi

c++ - 使用 c++11 的 header ,获取 0 到 n 之间的整数的正确方法是什么?

转载 作者:IT老高 更新时间:2023-10-28 22:28:09 35 4
gpt4 key购买 nike

我刚刚开始使用 C++11 的 <random>第一次上头,不过还是有些东西显得有些神秘。这个问题是关于完成一项非常简单的任务的预期、惯用的最佳实践方式。

目前,在我的代码的一部分中,我有这样的内容:

std::default_random_engine eng {std::random_device{}()};
std::uniform_int_distribution<> random_up_to_A {0, A};
std::uniform_int_distribution<> random_up_to_B {0, B};
std::uniform_int_distribution<> random_up_to_some_other_constant {0, some_other_constant};

然后当我想要一个介于 0 和 B 之间的整数时,我调用 random_up_to_B(eng) .

由于这开始看起来有点傻,我想实现一个函数rnd这样 rnd(n, eng)返回一个介于 0 和 n 之间的随机整数。

类似下面的东西应该可以工作

template <class URNG>
int rnd(int n, URNG &eng) {
std::uniform_int_distribution<> dist {0, n};
return dist(eng);
}

但这涉及到每次都创建一个新的分发对象,我觉得这不是你应该这样做的方式。

所以我的问题是,使用 <random> 提供的抽象来完成这个简单任务的预期最佳实践方法是什么?标题?我之所以这么问,是因为我以后肯定想做比这更复杂的事情,而且我想确保我以正确的方式使用这个系统。

最佳答案

uniform_int_distribution 构建起来应该不会很昂贵,因此每次创建一个新的限制应该是可以的。但是,有一种方法可以使用具有新限制的相同对象,但是很麻烦。

uniform_int_distribution::operator() 有一个重载,它接受一个 uniform_int_distribution::param_type 对象,该对象可以指定要使用的新限制,但 param_type 本身是一个不透明类型,并且没有除了从现有的 uniform_int_distribution 实例中提取它之外,构建一个可移植的方法。例如,以下函数可用于构造 uniform_int_distribution::param_type

std::uniform_int_distribution<>::param_type
make_param_type(int min, int max)
{
return std::uniform_int_distribution<>(min, max).param();
}

将这些传递给operator(),生成的结果将在指定范围内。

Live demo

所以如果你真的想重用相同的uniform_int_distribution,使用上面的函数创建并保存多个param_type实例,并在调用operator( ).


上面的答案是不准确的,因为标准确实指定 param_type 可以从与相应分布类型的构造函数使用的相同分布参数构造。感谢@T.C.为 pointing this out

来自 §26.5.1.6/9 [rand.req.dist]

For each of the constructors of D taking arguments corresponding to parameters of the distribution, P shall have a corresponding constructor subject to the same requirements and taking arguments identical in number, type, and default values. ...

所以我们不需要为了提取param_type而不必要地构造分布对象。而是可以将 make_param_type 函数修改为

template <typename Distribution, typename... Args>
typename Distribution::param_type make_param_type(Args&&... args)
{
return typename Distribution::param_type(std::forward<Args>(args)...);
}

可以用作

make_param_type<std::uniform_int_distribution<>>(0, 10)

Live demo

关于c++ - 使用 c++11 的 <random> header ,获取 0 到 n 之间的整数的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24566574/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com