按照Stephan T. Lavavej的讲话(见here),我正在使用Mersenne Twister随机数生成器并使用这种代码生成随机数
#include <iostream>
#include <random>
int main()
{
std::mt19937 mt(132);
std::uniform_int_distribution<int> dist(0,50);
for (int i =0;i<10;i++)
{
std::cout << dist(mt) << std::endl;
}
}
我想使用shuffle
函数(而不是random_shuffle
)函数进行随机播放(再次在演讲中推荐)。从cppreference.com开始,我看到函数以URBG&&
为参数。
我真的不明白URBG
是什么。我尝试提供mt19937
代替它,似乎工作正常。
#include <iostream>
#include <random>
int main()
{
std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
std::mt19937 mt(132);
std::shuffle(v.begin(),v.end(),mt);
for (int i=0;i<v.size();i++)
{
std::cout << v[i] << std::endl;
}
}
问题
URBG
? mt19937
的子类是URBG
吗?rand
,shuffle
或来自random.h
的任何函数)?答案 0 :(得分:2)
URBG是一个统一的随机比特生成器。在C ++用语中,它是一个函数对象,返回具有均匀概率分布的无符号整数值(即每个可能的结果同样可能与其他任何结果一样)。这些要求当然在标准中严格定义。
std::mt19937
个实例是URBG,因为它们满足此定义。 std::uniform_int_distribution
实例也满足它,因此在这种情况下,将一个或另一个传递给<random>
函数绝对没有区别。
但请注意,<random>
中定义的大多数分布都是而不是均匀设计,因此无法在预期使用URBG的地方使用它们(您将得到偏差的结果)。< / p>
答案 1 :(得分:2)
URBG
是模板参数的名称;它可以推导出各种类型,包括std::mt19937
。如果你进一步查看cppreference页面,你会看到:
g - 一个UniformRandomBitGenerator,其结果类型可转换为std :: iterator_traits :: difference_type
所以URBG
可以是任何类型:
URBG::result_type
是无符号整数类型URBG::min()
返回URBG::result_type
可能返回的最小operator()
(严格小于最大值)URBG::max()
返回URBG::result_type
可能返回的最大operator()
(严格大于min)URBG::operator()
(应用于提供的实例)以摊还的常量时间返回闭区间[URBG::min(), URBG::max()]
URBG::result_type
可转换为std::iterator_traits<RandomIt>::difference_type
新的随机数生成器通常具有某种形式的状态,但是如果库函数可以以某种方式接受(例如,通过将随机生成器对象作为std :: shuffle来实现),那么肯定的是,它们可能是使用