次のコードは、K回の実行でランダムな文字列を生成しようとしています。 しかし、新しく生成された文字列は、参照文字列と全く異なるようにしてください。 C++でループを再開する方法(ランダム実行で一意のシーケンスを見つける)
私は、「 」文字列生成プロセスを再開するために「続行」を使用しようとしました。しかし、それは動作していないようです。 私のアプローチでは何が問題になっていますか?
#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
#include <time.h>
using namespace std;
// In this code we want to print new string that is entirely different with
// with those in initVector
template <typename T> void prn_vec(std::vector <T>&arg, string sep="")
{ // simple function for printing vector
for (int n = 0; n < arg.size(); n++) {
cout << arg[n] << sep;
}
}
int main (int arg_count, char *arg_vec[]) {
// This is reference string
vector <string> initVec;
initVec.push_back("A");
initVec.push_back("A");
initVec.push_back("A");
initVec.push_back("A");
vector <string> DNA;
DNA.push_back("A");
DNA.push_back("C");
DNA.push_back("G");
DNA.push_back("T");
for (unsigned i =0; i< 10000; i++) {
vector <string> newString;
for(unsigned j=0; j<initVec.size(); j++) {
int dnaNo = rand() % 4;
string newBase = DNA[dnaNo];
string oldBase = initVec[j];
int sameCount = 0;
if (newBase == oldBase) {
sameCount++;
}
if (sameCount == initVec.size()) {
continue;
}
newString.push_back(newBase);
}
cout << "Run " << i << " : ";
prn_vec<string>(newString);
cout << endl;
}
return 0;
}
あなたのdesriptionは、 "新しく生成された文字列を参照文字列と完全に異なるようにしたい"と言います。コードは "新しい文字列が参照文字列と同じかどうか"をチェックしたいと思うようです。 – NotJarvis
あなたが 'rand()%M'を実行すると、あなたは一様な分布を得ていないことを指摘するべきです(私はこれがあなたが望むものだと思います)。 – Ismael
正しい式は '(rand()/(double)RAND_MAX)*(M-1)'であり、RAND_MAXで除算して0と1の間の一様な値を得てからM-1を掛けて0とM-1。 – Ismael