生成随机uint64_t

时间:2019-06-18 18:26:36

标签: c++ random c++14

给出任意类型e的{​​{3}} E,如何在整个范围内生成随机uint64_t

类似这样的情况,其中needs_random()函数需要一个随机uint64_t,而blah()函数则以现代的<random>风格编写,该样式接受任何类型的随机引擎E

void needs_random(uint64_t r);

template <typename E>
void blah(E& engine) {
  // ...
  needs_random(???);
}

具体来说,我正在尝试从任意引擎e播种xorshift随机数生成器,并且xorshift生成器需要两个uint64_t值作为种子。

2 个答案:

答案 0 :(得分:6)

要便于携带,只需将unsigned long longstd::uniform_int_distribution(或您需要的任何其他发行版)一起使用:

#include <type_traits>
#include <cstdint>
#include <random>
#include <iostream>

void needs_random(uint64_t r) {
    std::cout << r << "\n";
}

template <typename E>
void blah(E& engine) {
    std::uniform_int_distribution<unsigned long long> dis(
        std::numeric_limits<std::uint64_t>::min(),
        std::numeric_limits<std::uint64_t>::max()
    );
    needs_random(dis(engine));
}

int main() {
    std::random_device rd;
    std::mt19937 gen(rd());
    blah(gen);
    blah(gen);
}

保证类型unsigned long long至少为64位宽。从unsigned long longuint64_t的隐式整数转换应仅提取数字的最低有效64位。

此代码仅在sizeof(unsigned long long) * CHAR_BIT > 64之类的平台上不是最优的,因为较高的位将被闲置。但是代码仍然可以移植到此类平台,并且仍然可以使用。

答案 1 :(得分:0)

Set DSConn = Server.CreateObject("ADODB.Connection")
On Error Resume Next
   dbCon.DatabaseName = "DBNAME"
   DSConn.Open dbCon.GetConnectionString()

您可以使用#include <random> #include <iostream> int main() { std::random_device rd; std::mt19937_64 gen(rd()); std::uniform_int_distribution<uint64_t> dis; std::cout << dis(gen) << '\n'; return 0; } 来生成更多随机数。