【问题标题】:How to generate a random string in C++ [closed]如何在 C++ 中生成随机字符串 [关闭]
【发布时间】:2014-03-17 13:28:58
【问题描述】:

经过几个小时的折腾,我似乎无法弄清楚如何在 C++ 中制作随机字符串生成器。我想知道你能否告诉我你将如何去做。

【问题讨论】:

  • 与一个没有任何声誉或发布任何代码的人一起从 SO 发帖?!
  • 请更具体些?你想从某个字典中随机选择一个词吗?或者你只是想要一个随机的字符序列?如果是后者,有多少个字符?即你希望你的“随机”字符串有多长?等等。
  • 我想从一组字符中生成。在这种情况下,我使用 a-z,小写和大写,我也使用 0-9。字符串的长度无关紧要,因为我希望长度可以互换。
  • @user3280728 - 到目前为止你提出了什么代码?
  • 给定char distinct_chars[] = "abcd...xyz0123456789";,但循环多次附加distinct_chars[rand() % sizeof distinct_chars]。您可能还想了解srand(在main() 上调用一次)。

标签: c++ string random


【解决方案1】:

我不太确定你在问什么,但听起来你想要一些类似的东西:

const std::string VALID_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(0,VALID_CHARS.size() - 1);

std::ostringstream oss;
for (std::size_t i = 0; i < SOME_SIZE; ++i)
{
    oss << VALID_CHARS[distribution(generator)];
}
std::string your_random_string = oss.str();

你可以通过替换循环来简化它:

const std::string VALID_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(0,VALID_CHARS.size() - 1);
std::string your_random_string;
std::generate_n(std::back_inserter(your_random_string), SOME_SIZE, [&]()
{
    return VALID_CHARS[distribution(generator)];
});

此外,如果您可以使用 C++11,请避免使用 C 标准库函数(srandrand),因为较新的 C++11 &lt;random&gt; 库可以更好地控制随机类型生成器的数量和这些生成器的分布。

【讨论】:

    【解决方案2】:

    您可以使用 generate_n 和自定义 lambda 轻松完成:

    string generateRandomString(size_t length)
    {
      const char* charmap = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
      const size_t charmapLength = strlen(charmap);
      auto generator = [&](){ return charmap[rand()%charmapLength]; };
      string result;
      result.reserve(length);
      generate_n(back_inserter(result), length, generator);
      return result;
    }
    

    【讨论】:

      【解决方案3】:

      首先弄清楚如何创建您想要的分布的随机字符,并对其进行测试。在 C 和 C++ 中,char 是一种整数类型,因此您可以像使用整数一样使用它。例如

      char ch = 'A' + random()%26;
      

      这需要字符 A 并添加一个介于 0 和 25 之间的随机数。您需要对其进行调整以获得所需的字符/数字/标点符号的分布。您的随机数来源将根据您使用的系统库而有所不同。

      获得单个字符后,只需像往常一样将它们构建成一个字符串,例如使用 ostringstream。

      【讨论】:

        猜你喜欢
        • 2011-12-10
        • 2011-01-09
        • 2014-02-01
        • 2017-11-18
        • 2018-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多