我正在尝试创建一个由 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;
}
可能的输出:
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;
}
有很多方法可以做到这一点,这里只提到几种。祝你好运。
关于c++ - 创建随机二进制字符串 : how to remove null character '\0' from to_string() before inserting to another string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25357892/