Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实现64位Mersenne捻线器-定义 我正在学习C++,试图在指定范围内生成一些随机数。_C++_Random - Fatal编程技术网

实现64位Mersenne捻线器-定义 我正在学习C++,试图在指定范围内生成一些随机数。

实现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

我正在尝试实现,并对其进行修改,使其能够生成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;
}
功能失效

  • 我也不确定如何定义Mersenne捻线器:

    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);
    }