Ваш код выглядит на первый взгляд хорошо, если я не пропущу большую часть ваших требований.
Прочитайте это , прежде чем использовать rand()
. За исключением, конечно, части continue
. То, что вы пытаетесь сделать, это посмотреть, если это то же самое, что initVector
или нет, верно? Простое сравнение можно выполнить до того, как вы вставите его или напечатаете на консоли.
int sameCount = 0;
if (newBase == oldBase) {
sameCount++;
}
// sameCount can be 1 at most, 0 otherwise
// this check never return true
if (sameCount == initVec.size()) {
continue;
}
Переменная sameCount
инициализируется каждый раз, когда вы создаете новую запись для newString
, и выходит из области видимости при закрытии }
цикла for
. Таким образом, он не будет увеличен, чтобы функционировать как надлежащая проверка на наличие дубликатов. В идеале вы должны использовать std::set
и продолжать вставлять в него. Дубликаты не допускаются, и вы избавлены от многих неприятностей.
Подробнее об использовании rand()
srand()
и генерации случайных чисел:
Из comp.lang.c FAQ:
[...] биты младших разрядов многих генераторов случайных чисел крайне беспорядочно
Если вы хотите, чтобы ваши случайные числа находились в диапазоне
[0, 1, ... N - 1]
лучший метод по сравнению с простым rand() % N
(как указано в ссылке) - использовать следующее:
(int)((double)rand() / ((double)RAND_MAX + 1) * N)
Теперь, если вы запустите свою программу, каждый раз вы будете получать один и тот же набор из 10000 нечетных случайных нитей ДНК. Оказывается, это потому, что:
Для большинства генераторов псевдослучайных чисел (и определенного свойства ранда библиотеки C) характерно, что они всегда начинаются с одного и того же числа и проходят одну и ту же последовательность.
из другого FAQ comp.lang.c.
Для получения разных прядей попробуйте следующее:
#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main ( int arg_count, char *arg_vec[] ) {
// most pseudo-random number generators
// always start with the same number and
// go through the same sequence.
// coax it to do something different!
srand((unsigned int)time((time_t *)NULL));
// This is reference string
string initVec("AAAA");
// the family
string DNA("ACGT");
for (unsigned i =0; i< 5; i++) {
string newString;
for(unsigned j=0; j<initVec.size(); j++) {
int dnaNo = (int)((double)rand() / ((double)RAND_MAX + 1) * 4);
char newBase = DNA[dnaNo];
newString += newBase;
}
// ideally push in a std::set
// for now keep displaying everything
if (newString != initVec) {
cout << "Run " << i << " : " << newString << endl;
}
}
return 0;
}