实现64位Mersenne捻线器-定义 我正在学习C++,试图在指定范围内生成一些随机数。
我正在尝试实现,并对其进行修改,使其能够生成64位整数 我基本上成功了,基本程序可以如下所示:实现64位Mersenne捻线器-定义 我正在学习C++,试图在指定范围内生成一些随机数。,c++,random,C++,Random,我正在尝试实现,并对其进行修改,使其能够生成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
#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::mt19937_64 random_number_generator(random_device());
使功能按预期工作否,您不应在函数之外定义随机设备。最好将对象减少到满足其用途所需的最小范围。这有助于避免更难跟踪/理解的状态 您还应该在函数中定义Mersenne Twister 此外,如果要获取随机的64位(无符号)整数,请使用
中的std::uint64\u t
使用static
和thread\u local
关键字,我们可以将函数设置为只初始化Twister/使用std::random\u设备一次,而不是每次函数调用都重新创建它们,这很好
以下是一些我觉得在黑客攻击时很方便的好方法:
#include <random>
#include <cstdint>
std::uint64_t random_integer(std::uint64_t rand_min, std::uint64_t rand_max) {
static thread_local std::mt19937_64 rng{std::random_device{}()};
std::uniform_int_distribution<std::uint64_t> dist(rand_min, rand_max);
return dist(rng);
}
#包括
#包括
标准:uint64随机整数(标准:uint64随机最小值,标准:uint64随机最大值){
静态线程\u local std::mt19937\u 64 rng{std::random\u device{}()};
标准:均匀分布区(最小随机数,最大随机数);
返回距离(rng);
}
将静态线程\u local
添加到随机数\u设备
和随机数\u生成器
。您不希望在每次函数调用时都重新初始化它们。我建议的也是GCC标准库的用途:您还应该使用std::uint64\t
而不是unsigned long
。对于后者,不能保证它在您的平台上是64位的(尽管通常情况下可能是这样)。你能得到的唯一保证是它等于或大于unsigned long
@HenriMenke我可以问一下,你为什么要在rng{std::random_device{}()}
中为{
}
更改}
的正常。提前感谢。这是为了防止使用。如果使用老式的圆括号,则必须在某些点添加额外的圆括号,以使编译器确信这与函数声明无关。
#include <random>
#include <cstdint>
std::uint64_t random_integer(std::uint64_t rand_min, std::uint64_t rand_max) {
static thread_local std::mt19937_64 rng{std::random_device{}()};
std::uniform_int_distribution<std::uint64_t> dist(rand_min, rand_max);
return dist(rng);
}