小编典典

如何在 C++ 中创建随机字母数字字符串?

all

我想创建一个由字母数字字符组成的随机字符串。我希望能够指定字符串的长度。

我如何在 C++ 中做到这一点?


阅读 110

收藏
2022-06-28

共1个答案

小编典典

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 生成质量差的随机数。

来自微软的 Stephan T. Lavavej(stl) 在 Going Native 上就如何使用新的 C++11 随机函数以及为什么不使用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一次来播种名为 的随机数生成器mtrandom_device()比 慢mt19937,但它不需要播种,因为它从您的操作系统请求随机数据(它将来自不同的位置,例如RdRand)。


查看这个问题/答案,它似乎uniform_real_distribution返回了[a, b)您想要的范围内的数字[a, b]。为此,我们uniform_real_distibution实际上应该如下所示:

std::uniform_real_distribution<double> dist(1, std::nextafter(10, DBL_MAX));
2022-06-28