生成随机字符串并不总是返回正确的长度

时间:2017-10-01 15:58:14

标签: c++

我正在开发一个需要生成随机字符串的项目。它主要工作,除了某些原因,不时地,返回的字符串不是正确的长度。

我的代码

$("#datetimepicker1 input[name='invoicedate']").datetimepicker({
    locale: 'nl',
    format: 'YYYY-MM-DD',
    allowInputToggle: true,
    useCurrent: false,
}); 

我传入26作为长度,我得到以下字符串返回:

string HelperMethods::generateRandomString(int length)
{
    static const char alphanum[] =
        "0123456789abcdefghijklmnopqrstuvwxyz";

    stringstream randomString;

    //Generate a seed for the random number generator
    srand(time(0));
    for (int i = 0; i < length; ++i)
    {
        randomString << alphanum[rand() % sizeof(alphanum) - 1];
    }


    return randomString.str();
}

为什么返回的字符串总是没有正确的长度?

1 个答案:

答案 0 :(得分:10)

alphanum中有一个NUL字符。毕竟,它是一个C字符串。当您尝试排除它时,-的优先级低于%

因此rand() % sizeof(alphanum) - 1(rand() % sizeof(alphanum)) - 1相同。您可能在某些时候访问数组的第一个元素之前。那就是那里明显的未定义行为。

此外,您不应该多次为随机数生成器播种。这也可能会扭曲结果。但是,它当然不像未定义的行为那么多。