Foi*_*vos 3 c++ string genetic-algorithm
我正在尝试创建一个由0和1组成的随机二进制字符串.在我的实现中,我生成随机整数0和1,然后我使用std :: to_string()以将它们转换为字符串并将它们插入另一个字符串.我遇到的问题是,似乎通过使用std :: to_string()来插入'0'或'1'字符,我还插入了终止空字符'\n',因此我加倍了串.例如,假设我要创建一个由Nbits = 10个字符组成的字符串.通过下面的实现,我得到一个10元素字符串,如屏幕上打印,但字符串的大小是其两倍.你知道我怎么能避免这个吗?
大小的问题在于我正在尝试编写遗传算法的二进制表示,并且我需要大小是交叉/变异操作符正确的大小.
#include <iostream>
#include <string>
#include <random>
using namespace std;
std::random_device rd;
std::mt19937 gen(rd());
// Random bit string generator
string random_string(size_t Nbits){
std::uniform_int_distribution<> int1(0,1);
string s;
s.resize(Nbits);
for(size_t i=0; i<Nbits; i++)
s.insert(i,to_string(int1(gen)));
return s;
};
int main(){
// Say I want a 10 bits random binary string
size_t Nbits=10;
string s=random_string(Nbits);
// If I print my string on screen, it has the correct number of entries:
cout<<s<<endl;
// However the size of the string is not equal to the number of entries.
cout<< "Number of bits is: "<< Nbits<<", length of string is "<< s.size()<<endl;
}
Run Code Online (Sandbox Code Playgroud)
可能的输出:
1001111111
Number of bits is: 10, length of string is 20
Run Code Online (Sandbox Code Playgroud)
您的插入逻辑正在转换它不需要的值.没有理由转换一串比特的数据,你已经知道每个比特的可能结果:0
或1
.
这.insert()
是错误的方法.您正在将数据堆叠到之前已调整大小的字符串中,从而添加更多字符,而不是替换它们.您应该从一个空字符串开始,然后将数据推入,如果需要,保留(但不是必需的).
试试这个:
std::string random_string(size_t Nbits)
{
std::uniform_int_distribution<> int1(0,1);
string s;
s.reserve(Nbits);
for (size_t i=0; i<Nbits; i++)
s.push_back(int1(gen) ? '1' : '0');
return s;
};
Run Code Online (Sandbox Code Playgroud)
或者,利用这个事实,'0'
并'1'
保证每个标准的连续值,并可能做这样的事情:
std::string random_str(size_t Nbits)
{
std::string s;
std::generate_n(std::back_inserter(s), Nbits,
std::bind(std::uniform_int_distribution<char>('0', '1'),std::ref(gen)));
return s;
}
Run Code Online (Sandbox Code Playgroud)
有很多方法可以做到这一点,这里只提到一些.祝你好运.
归档时间: |
|
查看次数: |
244 次 |
最近记录: |