3

我正在研究一个一维细胞自动机程序,它需要一串 20 个 1 和 0。现在,我有一个常量字符串,每次都以相同的方式启动程序。我的问题:如何随机化字符串,以便每次运行程序时得到不同的结果?任何帮助,将不胜感激。

到目前为止,这是我的代码:

#include <iostream>
#include <bitset>
#include <string>
#include <ctime>

using namespace std;

const int arrSize = 20;
int numGen = 10;
string Initial = "1001101010110100010";

int main()
{
bitset<arrSize + 2> array(Initial);

for(int i = 0; i < numGen; i++)
{
bitset<arrSize + 2> tempArr(array);

for(int k = arrSize; k >= 1 ; k--)
{
if(array[k])
cout << "1";
else
cout << "0";

int number = (int)array[k-1] << 2 | (int)array[k] << 1 | (int)array[k+1];

tempArr[k] = (number == 3 || number == 5 || number == 6);

}

array = tempArr;
cout << endl;
}
}
4

3 回答 3

2

您可以在开始程序之前构建一个随机字符串。

string generateRandomString(){
    string s = "";
    for(int i=0;i<20;i++){
        if(rand()%2==0) s+="0";
        else s+="1";
    }
    return s;
}

然后把它作为你主要的第一行 -

int main(){
    srand(time(NULL));//Dont forget to seed your randoms!
    Initial = generateRandomString();// btw making the variable Initial capitalzied does not follow convention. 
    ....

还要确保添加以下内容 -

#include<stdlib.h>
#include<time.h>
于 2013-09-25T19:34:56.190 回答
2

您可以使用std::generate_n随机数生成器来用随机位填充字符串:

#include <random>
#include <algorithm>
#include <iostream>
#include <string>

int main()
{
    std::string bits(10, '0');
    std::random_device rd;
    std::default_random_engine eng(rd());

    std::generate_n(bits.begin(), 
                    bits.size(), 
                    [&](){ return eng() % 2 == 0 ? '0' : '1'; });

    std::cout << bits << "\n";  // displays e.g. 1010111110
}

如果您只想随机化现有的0s 和1s 字符串(即保留数字的特定分布但更改它们的顺序),那么您可能会发现std::random_shuffle有用:

#include <algorithm>
#include <iostream>
#include <string>

int main()
{
    std::string bits = "0000011111";

    std::random_shuffle(bits.begin(), bits.end());

    std::cout << bits << "\n";  // displays e.g. 0011010011
}
于 2013-09-25T19:41:23.340 回答
1

这个怎么样 :

struct new_str {
    new_str(std::string str )
        : str(str), len(str.size()) { }

    char operator ()() const {
     return str[static_cast<std::size_t>(std::rand() * 
                   (1.0 / (RAND_MAX + 1.0 )) * len)];
    }

    std::string str;
    std::size_t len;
};

然后在std::generate

std::srand(std::time(0));
std::string Initial="1001101010110100010";
std::generate_n(Initial.begin(), Initial.size(), new_str(Initial));
于 2013-09-25T19:47:53.363 回答