使用C ++中的约束创建随机字符串

时间:2013-11-29 00:52:30

标签: c++ random

我想创建一个长度为m * j的随机字符串,例如m = 4,j = 3。 我这样做了

static const char alphanum[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
return alphanum[rand() % stringLength]    

我保持stringlength = 3,以便返回的值只包含长度为20的随机顺序中的前三个字母(A,B,C)

我现在要做的是拥有一个随机字符串,其中A只有3次B只有4次而C只有3次。 如何应用这些约束? 计数器?

您好,    我做了类似答案中建议的事情。这是代码

static const char alphanum[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
//Function which generates a random character
char GetRandom(int Position){
    return alphanum[rand() % Position];
}
//******************************************************************************
//                          MAIN
//******************************************************************************
int main()
{
    //Assuming a 3 machines 3 jobs scenario. So chromosome
    int Jobs=4;
    int Machines=3;
    int ChromLength=Jobs*Machines;
    int StringLength=Jobs;
    int Counter[Jobs],i;
    char C;
    char Chromosome[(ChromLength-1)];
    //Seeding
    srand(time(0));
    //Init array
    for(int Cnt=0;Cnt<Jobs;Cnt++)
        Counter[Cnt]=0;
    //Test
    //Fill the array
    for(i=0;i<ChromLength;)
    {
        //Get the Character
        C=GetRandom(StringLength);
        cout<<"Char:"<<C<<endl;
        //Check which character is returend
        for(int j=0;j<StringLength;j++)
        {
            if(C==alphanum[j])
            {
                Counter[j]++;
                cout<<"I am in J "<<j<<" Char:"<<C<<endl;
                if(Counter[j]==Jobs)
                    break;
                else
                {
                    Chromosome[i]=C;
                    cout<<"I:"<<i<<endl;
                    i++;
                }
            }
        }
    }
    cout<<Chromosome;

    return 0;
}

但输出有一些尾随字符无法理解它们是什么 这是一个截图 screenshot

1 个答案:

答案 0 :(得分:1)

我最近需要做那样的事情,所以我提出了这个:

#include <iostream>
#include <random>
#include <vector>
#include <cctype>
#include <algorithm>

首先我们有一个返回随机字符的函数。

unsigned seed1 = std::chrono::system_clock::now().time_since_epoch().count();
/* or try this:
std::random_device rd; 
auto seed1= rd();
*/
std::minstd_rand0 g1 (seed1);
static const std::string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
std::uniform_int_distribution<int> dist(0, alphabet.size()-1);

char get_random_char() {
    return alphabet[dist(g1)];
}

然后此函数获取随机字符并拒绝那些与谓词不匹配的字符。当所有字符都满足谓词时,循环停止。

    template <class Pred>
    std::string generate_string(int length, Pred pred) {
        int index = 0;
        std::string final = "";
        while (true) {
           char current = get_random_char();
           if (!pred(index, current)) continue;

           final += current;

           index++;
           if (index >= length) break;
        }
        return final;
    }

我们这里的谓词是作为lambda传入的。为简单起见,我计算A,B和C已经显示的次数,如果当前字符是其中任何一个并且计数太高,则返回false。

int main() {
    int A_count = 0;
    int B_count = 0;
    int C_count = 0;

    std::cout << generate_string(20, [&] (int i, char c) {
            if (c == 'A') A_count++;
            if (c == 'B') B_count++;
            if (c == 'C') C_count++;
            if (A_count > 3 && c == 'A') return false;
            if (B_count > 4 && c == 'B') return false;
            if (C_count > 3 && c == 'C') return false;
            return true;
    });

    return 0;
}

理智检查:

std::string test = generate_string(1000, [&] (int i, char c) {
        if (c == 'A') A_count++;
        if (c == 'B') B_count++;
        if (c == 'C') C_count++;
        if (A_count > 3 && c == 'A') return false;
        if (B_count > 4 && c == 'B') return false;
        if (C_count > 3 && c == 'C') return false;
        return true;
    });
std::cout << "A Count: " << std::count(test.begin(), test.end(), 'A') << std::endl;
std::cout << "B Count: " << std::count(test.begin(), test.end(), 'B') << std::endl;
std::cout << "C Count: " << std::count(test.begin(), test.end(), 'C') << std::endl;

输出:

A Count: 3
B Count: 4
C Count: 3