我想创建一个长度为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;
}
但输出有一些尾随字符无法理解它们是什么 这是一个截图
答案 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