用随机字节填充字节向量

时间:2021-01-17 09:14:19

标签: c++

我想用随机或伪随机字节的数据填充 std::vector<BYTE>。我已经在 stackoverflow 中编写了(换句话说,找到了)以下源代码,但它没有在我的 Visual Studio 中编译。

#include <Windows.h>
#include <vector>
#include <random>
#include <climits>
#include <algorithm>
#include <functional>

using random_bytes_engine = std::independent_bits_engine<std::default_random_engine, CHAR_BIT, BYTE>;

int main()
{
    random_bytes_engine rbe;
    std::vector<BYTE> data(1000);
    std::generate(data.begin(), data.end(), std::ref(rbe));
}

当我尝试编译上面的代码时,Visual Studio 给我以下错误:

<块引用>

错误 C2338 注意:char、signed char、unsigned char、char8_t、int8_t、 和 uint8_t 不允许消息传递

错误 C2338 无效的independent_bits_engine 模板参数: N4659 29.6.1.1 [rand.req.genl]/1f 需要 unsigned short 之一, unsigned int、unsigned long 或 unsigned long long 消息传递。

3 个答案:

答案 0 :(得分:3)

BYTE 类型,它只是 unsigned char 的别名,不是

UIntType 参数允许的类型
template<class Engine, std::size_t W, class UIntType>
class independent_bits_engine;

标准,[rand.req.genl]/1.f,reads

<块引用>

在本小节 [rand] 中,实例化模板的效果:

...

  • 具有名为 UIntType 的模板类型参数是未定义的,除非相应的模板参数是 cv-unqualified 并且是 unsigned shortunsigned intunsigned long 或 { 之一{1}}。

答案 1 :(得分:2)

只需这样做:

using random_bytes_engine = std::independent_bits_engine<std::default_random_engine, 32, uint32_t>;

将引擎变成 32 位随机数生成器,但使用它来初始化 BYTE 向量效果很好。

答案 2 :(得分:2)

Evg 的回答是正确的。

如果你真的只想有随机字节,我会使用一个自定义生成器函数来生成 [-128, 127] 或任何所需范围之间的值。 例如:

#include <iostream>
#include <Windows.h>

#include <vector>
#include <random>
#include <algorithm>
#include <limits>

int main()
{
    std::random_device r;
    std::default_random_engine randomEngine(r());
    std::uniform_int_distribution<int> uniformDist(CHAR_MIN, CHAR_MAX);

    std::vector<BYTE> data(1000);
    std::generate(data.begin(), data.end(), [&uniformDist, &randomEngine] () {
        return uniformDist(randomEngine);

    });

    for (auto i : data) {
        std::cout << int(i) << std::endl;
    }
    return 0;
}

参考文献:

  1. https://en.cppreference.com/w/cpp/numeric/random
  2. https://en.cppreference.com/w/cpp/algorithm/generate
相关问题