Мне нравится, когда код дает мне головные боли. Кроме этого. Я просто заполняю вектор случайными удвоениями, используя часто используемый алгоритм. Проблема заключается в том, что после компиляции она дает мне ошибку "Итератор не вызывающей ошибки". Вот мой кодовый путь:
-First Я создаю экземпляр класса.
Random rm;
-Which запускает этот конструктор
Random::Random() // Constructor
{
this->cAR();
this->min = 0; // Default: Sets minimum to zero
this->max = RAND_MAX; // Default: Sets maximum to RAND_MAX
fillVect(); // Fills vector
this->numCount = num.begin();
}
-cAR просто устанавливает некоторые значения в нижней функции
void Random::cAR()
{
this->num.clear();
this->num.reserve(250);
this->place = 0;
}
-Now для основной проблемы (я думаю), я повторяю вектор и заполняю его случайными числами
void Random::fillVect()
{
srand(time(NULL));
vector<double>::iterator counter;
for (counter = this->num.begin(); counter <= num.end(); counter++)
{
*counter = (((double) rand() / (double) RAND_MAX) * (this->max - this->min)) + this->min;
}
shuffle();
}
-That должен заполнить вектор (который является "двойным" вектором типа, btw) со случайными числами. Затем я вызываю следующее число в векторе (который должен быть 0-м индексом в начале) с этим утверждением
double r = rm.nextDbl();
-Which определяется в этой функции
double Random::nextDbl()
{
double temp = *numCount;
return temp;
numCount++;
place++;
}
В моей голове это правильный путь кода. Теперь я только кодировал 2 года и только 1 год в качестве студента в реальном колледже, поэтому мой вопрос был бы, почему он дает мне эту ошибку времени выполнения? Я ценю любую помощь заранее.
У вас две проблемы в коде. Во-первых: вы разыскиваете итератор end()
в своем цикле
for (counter = this->num.begin(); counter <= num.end(); counter++)
// ^^ should be less than
Во-вторых: ваш num
вектор пуст, поэтому, как только вы исправите первую проблему, вы просто не получите числа:
this->num.clear(); // num is now empty
this->num.reserve(250); // num is still empty
Я думаю, вы хотели называть resize(250)
вместо reserve(250)
. Последний просто гарантирует, что вектор имеет достаточную емкость... если он уже был пуст, он останется пустым.
Кроме того, два предложения:
num
, поэтому этот алгоритм сделает его явным для ваших читателей.Ваш подход к выбору случайного числа неравномерен:
(((double) rand()/(double) RAND_MAX) * (this->max - this->min)) + this->min;
Это не приведет к равномерному распределению, даже если rand()
сам создаст равномерное распределение... и это почти никогда не даст вам this->max
как значение. Гораздо лучшее решение было бы:
int nextRandom() {
int range = this->max - this->min + 1;
int max_rand = RAND_MAX / range * range; // largest multiple of range under RAND_MAX
for (;;) {
int r = rand();
if (r < max_rand) {
return (r % range) + this->min;
}
}
}
Вы разыскиваете итератор end()
, который недействителен:
for (counter = this->num.begin(); counter <= num.end(); counter++)
Это должно быть:
for (counter = this->num.begin(); counter != num.end(); ++counter)
fillVect()
. Это самое разумное место.