如何在C ++中生成随机字符串?

时间:2010-01-27 12:28:47

标签: c++ string random

我正在寻找在C ++中生成随机字符串的方法。这是我的代码:

string randomStrGen(int length) {
    static string charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
    string result;
    result.resize(length);

    srand(time(NULL));
    for (int i = 0; i < length; i++)
        result[i] = charset[rand() % charset.length()];

    return result;
}

seed(time(NULL))不够随意。还有其他更好的方法可以在C ++中生成随机字符串吗?

6 个答案:

答案 0 :(得分:25)

不要在每个函数调用上调用srand() - 只在第一次函数调用或程序启动时调用它一次。你想要一个标志,表明是否已经调用了srand()

除了误用srand()并获得可预测的不良结果外,消化方法很好。

答案 1 :(得分:1)

您可以使用Boost.Random。它使用的发生器与大多数标准库提供的发生器不同,应该更加健壮。

具体而言,大多数标准库提供了线性同余生成器,当您mod使用较小的数字时,它们的效果不佳。 Boost.Random有一个Mersenne捻线机发生器。

正如锐齿所说的那样(好的发现!),只在你的程序一开始就播种一次。每当你想要一些随机的东西时播种就会适得其反。

答案 2 :(得分:1)

创建一个界面以获取此网站http://www.random.org/中的随机数,您将确保获得一个真正的随机数!但如果你正在寻找表现......

答案 3 :(得分:0)

在unix系统上,您可以从文件/dev/random

中读取随机值

答案 4 :(得分:0)

如果您更喜欢使用标准库,那么您可以执行以下操作:

<somewhere else>
srand(NULL);
</somewhere else>

char get_rand_char() {
  static string charset(...);
  return charset[rand() % charset.size()];
}

std::string generate_random_string(size_t n) {
  char rbuf[n];
  std::generate(rbuf, rbuf+n, &get_rand_char);
  return std::string(rbuf, n);
}

这段代码自然更加模块化,标准库维护者倾向于编写比我更好的代码。通过这种方式,我可以更改代码的随机字符生成部分,而无需触及任何其他内容。我甚至可以转发一个随机选择随机数生成器的函数!并不是说会增加随机性或任何东西......

答案 5 :(得分:0)

使用std :: generate_n。这样,您可以指定生成的字符串的长度。在下面的例子中它是4。

std::string uniqueName() {
    auto randchar = []() -> char
    {
        const char charset[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        const size_t max_index = (sizeof(charset) - 1);
        return charset[ rand() % max_index ];
    };
    std::string str(4,0);
    std::generate_n( str.begin(), 4, randchar );
    return str;
}