我想用随机或伪随机字节的数据填充 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 消息传递。
答案 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 short
、unsigned int
、unsigned 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;
}
参考文献: