我正在寻找在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 ++中生成随机字符串吗?
答案 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;
}