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

时间:2017-12-15 19:12:41

标签: 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;
}

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

我已在- 1后面添加sizeof(pool),试图避免从pool添加空终结符,但这并没有改变任何内容。

我哪里出错了?

1 个答案:

答案 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,只要它不是空的。