为什么我的随机字符串生成器产生太短的字符串?

Cob*_*ast 2 c++ string random

我写了一个返回随机字符串的简单函数.

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;
}
Run Code Online (Sandbox Code Playgroud)

但是,有时它会返回一个随机短于48个字符的字符串.

我已经添加了试图避免添加null-terminator 的- 1背后,但这并没有改变任何东西.sizeof(pool)pool

我哪里做错了?

Chr*_*nis 6

a)给定一个字符串文字"123",大小为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,只要它不是空的.