【问题标题】:How to generate a random, non-repeating string C++ [duplicate]如何生成随机的、非重复的字符串 C++ [重复]
【发布时间】:2015-11-01 18:25:23
【问题描述】:

我需要生成一个指定长度的代码,它必须是随机且不重复的,到目前为止,我有随机字符串但它是重复的字母

这是我的代码;

#include <string>
#include <cstdlib>
#include <ctime>

class random_text_generator
{
public:
random_text_generator(const std::string& str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
: m_str(str)
{
    std::srand(std::time(0));
}   
std::string operator ()(std::size_t len = 1)
{
    std::string seq;
    std::size_t siz = m_str.size();
    if(siz)
        while(len--)
            seq.push_back(m_str[rand() % siz]);
    return seq;
}
private:        
std::string m_str;
};

#include <iostream>

int main(void)
{
using namespace std;
random_text_generator rtg;
for(size_t cnt = 0; cnt < 7; ++cnt)
  {
    cout << rtg(cnt) << endl;
  }
}

同样,这段代码生成了字符串,但它重复了一些字母,例如输出看起来像这样

**OUTPUT**
A K X K Y

看到 K 重复了。

【问题讨论】:

  • 如果您可以改用&lt;random&gt;
  • 当你说它不重复时,你的意思是它不是随机的?对于相同的数字出现并随机出现完全有效
  • 一个简单的解决方案是创建一个包含所有可能字符的字符串,正如您所做的那样,使用std::random_shuffle,然后将字符串大小调整为所需的字符数。
  • @XX3987: 所以只取洗牌后数组的前6个字母...
  • @XX3987 std::random_shuffle 可以打乱所有随机访问范围,这包括std::strings。

标签: c++ arrays string random vector


【解决方案1】:

您可以使用类似于以下代码的内容。 这会生成有效字符的随机排列,然后将此排列的前 6 个字符复制到一个新字符串中。

#include <random>
#include <string>
#include <iostream>
#include <algorithm>

int main()
{
    const int max_len = 6;
    std::string valid_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

    std::random_device rd;
    std::mt19937 g(rd());

    std::shuffle(valid_chars.begin(), valid_chars.end(), g);

    std::string rand_str(valid_chars.begin(), valid_chars.begin() + max_len);
    std::cout << rand_str;
    return 0;
}

live example

【讨论】:

    【解决方案2】:

    所以这个功能解决了我的问题

    void foonkshun(){
    
    char database[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K','L', 'M', 
    'N', 'O','P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
    
    random_shuffle(database, database + 25);
    
    for (int i = 1; i < 6; i++){
        cout << database[i];
       }
    }
    

    感谢 Neil Kirk、Ed Heal、CAD、Cornstalks。 :D

    【讨论】:

      猜你喜欢
      • 2010-12-07
      • 1970-01-01
      • 2011-08-06
      • 2017-04-05
      • 1970-01-01
      • 2015-08-16
      • 2014-02-05
      • 2011-12-08
      相关资源
      最近更新 更多