在仿真中,生成随机数据是常见需求,例如用于安全密钥生成、测试数据生成等。该文给大家分享两个在C++中生成随机二进制字符串和十六进制字符串的方法。
#include <iostream>
#include <string>
#include <random>
#include <bitset>
#include <sstream>
#include <iomanip>
// 功能:生成一个n bits随机二进制字符串
std::string generateRandomBitsetString(size_t n) {
std::string bitsetString;
std::random_device rd; // Obtain a random number from hardware
std::mt19937 gen(rd()); // Seed the generator
std::uniform_int_distribution<> distrib(0, 1); // Define the range
for (size_t i = 0; i < n; ++i) {
bitsetString.push_back('0' + distrib(gen)); // Append '0' or '1'
}
return bitsetString;
}
// 功能:生成一个n bytes随机字符串
std::string generateRandomHexString(size_t n) {
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> distrib(0, 255);
std::stringstream ss;
for (size_t i = 0; i < n; ++i) {
int random_byte = distrib(gen);
// ss << std::hex << std::setw(2) << std::setfill('0') << random_byte; // 小写
ss << std::hex << std::uppercase << std::setw(2) << std::setfill('0') << random_byte; // 大写
}
return ss.str();
}
其中:
std::random_device
:用于获取一个随机数种子。std::mt19937
:一种基于梅森旋转算法的伪随机数生成器。std::uniform_int_distribution<>
:生成一个指定范围内的均匀分布的随机数。std::stringstream
:构建字符串,利用std::hex
来转换数字为十六进制。std::uppercase
:使得十六进制表示中的字母为大写。std::setw(2)
和std::setfill('0')
确保每个输出都是两位数,不足的位数用 0 填充。