在没有提升的情况下在 C++ 中生成随机 128 位
Generate random 128 bit in c++ without boost
我有一个 128 位大小的数据类型,我喜欢在不使用 boost 或任何第三方的情况下生成一个随机值 headers/libraries。
我写了下面的代码片段,它工作正常,但我想知道是否有任何 issues/pitfalls 方法。
#include <stdlib.h>
#include <time.h>
#include <array>
#include <iostream>
#include <random>
int main() {
constexpr int size = 16;
std::array<std::uint8_t, size> randomID;
std::mt19937_64 gen_{std::random_device{}()};
std::uniform_int_distribution<std::uint8_t> dis_{1};
for (int i = 0; i < randomID.size(); i++) {
randomID[i] = dis_(gen_);
std::cout << unsigned(randomID[i]) << " ";
}
return 0;
}
已发布方法的一个问题是它永远不会生成 0 八位字节。
std::uniform_int_distribution<std::uint8_t> dis_{1};
// ^ the range will be [1, 255]
您还可以使用 uint64_t
的分布并在数组
中展开位
std::uniform_int_distribution<std::uint64_t> dis_{};
for ( size_t i{}; i < randomID.size(); i += 8 )
{
auto r{ dis_(gen_) };
for ( unsigned j{}; j < 8; ++j )
{
randomID[i + j] = (r >> (j * 8)) & 0xFF;
std::cout << unsigned(randomID[i + j]) << " ";
}
}
也考虑使用 std::seed_seq
来初始化 std::mt19937
。
std::random_device rd{};
std::seed_seq ss{ rd(), rd(), rd() };
// ^^^^^^^^^^^^^^^^ Increase the entropy.
std::mt19937_64 gen_{ ss };
我有一个 128 位大小的数据类型,我喜欢在不使用 boost 或任何第三方的情况下生成一个随机值 headers/libraries。 我写了下面的代码片段,它工作正常,但我想知道是否有任何 issues/pitfalls 方法。
#include <stdlib.h>
#include <time.h>
#include <array>
#include <iostream>
#include <random>
int main() {
constexpr int size = 16;
std::array<std::uint8_t, size> randomID;
std::mt19937_64 gen_{std::random_device{}()};
std::uniform_int_distribution<std::uint8_t> dis_{1};
for (int i = 0; i < randomID.size(); i++) {
randomID[i] = dis_(gen_);
std::cout << unsigned(randomID[i]) << " ";
}
return 0;
}
已发布方法的一个问题是它永远不会生成 0 八位字节。
std::uniform_int_distribution<std::uint8_t> dis_{1};
// ^ the range will be [1, 255]
您还可以使用 uint64_t
的分布并在数组
std::uniform_int_distribution<std::uint64_t> dis_{};
for ( size_t i{}; i < randomID.size(); i += 8 )
{
auto r{ dis_(gen_) };
for ( unsigned j{}; j < 8; ++j )
{
randomID[i + j] = (r >> (j * 8)) & 0xFF;
std::cout << unsigned(randomID[i + j]) << " ";
}
}
也考虑使用 std::seed_seq
来初始化 std::mt19937
。
std::random_device rd{};
std::seed_seq ss{ rd(), rd(), rd() };
// ^^^^^^^^^^^^^^^^ Increase the entropy.
std::mt19937_64 gen_{ ss };