我正在尝试创建一个由0和1组成的随机二进制字符串。在我的实现中,我生成随机整数0和1s,然后使用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;
}
可能的输出:
1001111111
Number of bits is: 10, length of string is 20
您的插入逻辑正在转换不需要的值。如果您已经知道每个位的可能结果,则没有理由为一串位转换数据: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;
};
另外,可以利用'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;
}
有很多方法可以做到这一点,这里仅提及其中的几种。祝你好运。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句