我想创建一个由字母数字字符组成的随机字符串。我希望能够指定字符串的长度。
我如何在 C++ 中做到这一点?
Mehrdad Afshari 的回答可以解决问题,
void gen_random(char *s, size_t len) { for (size_t i = 0; i < len; ++i) { int randomChar = rand()%(26+26+10); if (randomChar < 26) s[i] = 'a' + randomChar; else if (randomChar < 26+26) s[i] = 'A' + randomChar - 26; else s[i] = '0' + randomChar - 26 - 26; } s[len] = 0; }
但我发现它对于这个简单的任务来说有点过于冗长。查找表有时可以创造奇迹:
#include <ctime> #include <iostream> #include <unistd.h> std::string gen_random(const int len) { static const char alphanum[] = "0123456789" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"; std::string tmp_s; tmp_s.reserve(len); for (int i = 0; i < len; ++i) { tmp_s += alphanum[rand() % (sizeof(alphanum) - 1)]; } return tmp_s; } int main(int argc, char *argv[]) { srand((unsigned)time(NULL) * getpid()); std::cout << gen_random(12) << "\n"; return 0; }
请注意,rand 生成质量差的随机数。
rand
来自微软的 Stephan T. Lavavej(stl) 在 Going Native 上就如何使用新的 C++11 随机函数以及为什么不使用rand(). 在其中,他包含了一张幻灯片,基本上可以解决您的问题。我已经从下面的幻灯片中复制了代码。
rand()
你可以在这里看到他的完整演讲:
#include <random> #include <iostream> int main() { std::random_device rd; std::mt19937 mt(rd()); std::uniform_real_distribution<double> dist(1.0, 10.0); for (int i=0; i<16; ++i) std::cout << dist(mt) << "\n"; }
我们使用random_device一次来播种名为 的随机数生成器mt。random_device()比 慢mt19937,但它不需要播种,因为它从您的操作系统请求随机数据(它将来自不同的位置,例如RdRand)。
random_device
mt
random_device()
mt19937
查看这个问题/答案,它似乎uniform_real_distribution返回了[a, b)您想要的范围内的数字[a, b]。为此,我们uniform_real_distibution实际上应该如下所示:
uniform_real_distribution
[a, b)
[a, b]
uniform_real_distibution
std::uniform_real_distribution<double> dist(1, std::nextafter(10, DBL_MAX));