创建随机二进制字符串:如何在插入到另一个字符串之前从 to_string() 中删除空字符''

Create random binary string: how to remove null character '' from to_string() before inserting to another string

本文关键字:字符串 string 删除 字符 二进制 随机 插入 创建 另一个 to      更新时间:2023-10-16

我正在尝试创建一个由0和1组成的随机二进制字符串。在我的实现中,我生成随机整数0和1,然后我使用std::to_string()将它们类型转换为字符串并将它们插入另一个字符串。我遇到的问题是,似乎通过使用std::to_string()来插入'0'或'1'字符,我还插入了终止null字符'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

您的插入逻辑正在转换它不需要的值。如果您已经知道每个位的可能结果:01,则没有理由将数据转换为一串位。

.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;
}
有很多方法可以做到这一点,这里只提到几个。祝你好运。

在函数random_string中创建一个Nbits字符的字符串,这意味着它的大小是Nbits。然后插入字符,使字符串变长。

有两种明显的解决方案:一种是使用i作为字符串的索引,并设置该字符。另一种是根本不设置大小,只是附加新字符。

创建随机二进制字符串的另一个解决方案是首先创建一个随机值:

  std::random_device rd;
  std::mt19937 gen(rd());
  std::uniform_int_distribution<> dis(0, 20);
  int val = dis(gen);

然后将此随机值作为输入参数传递给以下数字到二进制字符串转换器:

template<typename T>
std::string to_binary_string(T const &val) {
  return std::string(std::bitset<sizeof(T) * CHAR_BIT>(val).template to_string<char,std::string::traits_type,std::string::allocator_type>());
}

现场演示