给出任意类型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
值作为种子。
答案 0 :(得分:6)
要便于携带,只需将unsigned long long
与std::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 long
到uint64_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;
}
来生成更多随机数。