我编写了一个返回随机字符串的简单函数。
std::string cache::generateCacheName()
{
static const char pool[] = "0123456789abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
std::string r;
std::random_device rd;
std::mt19937 eng(rd());
std::uniform_int_distribution<> distr(0, sizeof(pool) - 1);
for (int i = 0; i < 48; i++)
r += pool[distr(eng)];
return r;
}
但是,有时它会返回一个随机短于48个字符的字符串。
我已在- 1
后面添加sizeof(pool)
,试图避免从pool
添加空终结符,但这并没有改变任何内容。
我哪里出错了?
答案 0 :(得分:6)
a)给定一个字符串文字&#34; 123&#34;,大小为4,因为它是一个包含4个const字符的数组,计算空值。
b)当你从那个大小中减去1时,得到3。
c)当你有一个包含3个元素的数组时,第3个元素位于偏移量2。
d)std :: uniform_int_distribution是在闭区间[a,b]上定义的。也就是说,直到并包括两个端点形成a到b。
e)当您选择一个随机数并且恰好是该区间中的最大值(在本例中为3)时,您从池中获取尾随空字节并将其插入到字符串中。您可能希望最大值为2,而不是3。
因此,如果碰巧选择分发中的最大数字,则字符串很短。也许你的代码会更清楚strlen(pool)-1,只要它不是空的。