在没有提升的情况下在 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 };