【发布时间】:2017-11-12 07:02:02
【问题描述】:
我正在学习C++,尝试在指定范围内生成几个随机数。
我正在尝试实现this answer here on SO,并对其进行修改以使其能够生成 64 位整数。
我基本上成功了,基本程序可能如下所示:
#include <iostream>
#include <random>
unsigned long long int random_integer(unsigned long long int rand_min, unsigned long long int rand_max)
{
// initialize = seed the random device
std::random_device random_device;
// use Mersenne Twister as random-number generator engine
std::mt19937_64 random_number_generator(random_device());
// number distribution, guaranteed unbiased
std::uniform_int_distribution<unsigned long long int> number_distribution(rand_min, rand_max);
return number_distribution(random_number_generator);
}
int main()
{
for (int i = 1; i <= 10; i++)
{
std::cout << random_integer(10000000, 100000000) << std::endl;
}
return 0;
}
问题:
-
我应该定义随机设备吗:
std::random_device random_device功能失效了?
-
我也不确定在哪里定义 Mersenne Twister:
std::mt19937_64 random_number_generator(random_device());让函数按预期工作。
【问题讨论】:
-
将
static thread_local添加到random_device和random_number_generator。您不想在每个函数调用上重新初始化它们。否则这对我来说看起来没问题。 -
您还应该使用
std::uint64_t而不是unsigned long long。对于后一种,不能保证它在您的平台上实际上是 64 位的(尽管通常情况下可能如此)。你得到的唯一保证是它等于或大于unsigned long。 -
@HenriMenke 请问你为什么将
{}改为rng{std::random_device{}()}中的正常(rng{std::random_device{}()}答案+我也不明白为什么有@987654341 @大括号。提前谢谢你。 -
这是为了通过使用C++11 uniform initialization syntax 来防止称为most vexing parse 的事情。如果您使用旧式括号,则必须在某些点添加额外的括号,以使编译器相信这与函数声明没有歧义。