c++ - 创建随机二进制字符串 : how to remove null character '\0' from to_string() before inserting to another string

标签 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;

}

可能的输出:

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;
}

有很多方法可以做到这一点,这里只提到几种。祝你好运。

关于c++ - 创建随机二进制字符串 : how to remove null character '\0' from to_string() before inserting to another string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25357892/

相关文章:

c++ - 在容器之间传输数据时如何解决可能丢失数据的警告?

Ruby:如何获取字符串的第一个字符

python - 遗传算法/用神经网络打蛇没有改善

C++ (Ubuntu) : load audio file (wav, mp3, aiff) 到数组/vector 与 gstreamer

c++ - 比较数组的更好方法?

c++ - 如何在 omnet++ 中的模块上单独调用 finish()

python - 轮盘赌选择具有正负适应度值以实现最小化

javascript - 如何将 xmlhttprequest 转换为字符串 javascript

string - Clojure 中搜索字符串向量

java - 在java中使用遗传算法生成时间表