Класс для подсчета частоты чисел в интервале

Мне нужно построить столбчатую диаграмму, иллюстрирующую распределение псевдослучайных чисел, определяемое линейным конгруэнтным методом.

Xn+1 = (a * Xn + c) mod m
U = X/m

на интервале [0,1]

Например:
Интервальная частота

[0;0,1]            0,05
[0,1;0,2]          0,15
[0,2;0,3]          0,1
[0,3;0,4]          0,12
[0,4;0,5]          0,1
[0,5;0,6]          0,15
[0,6;0,7]          0,05
[0,7;0,8]          0,08
[0,8;0,9]          0,16
[0,9;1,0]          0,4

Я написал такую ​​программу

lcg.h:

class LCG {
public:
LCG();
~LCG();
void setSeed(long);
float getNextRand();
void countFrequency();
void printFrequency();

private:
vector<int>frequencies;
long seed;
static const long a = 33;
static const long c = 61;
static const long m = 437;
};

lcg.cpp:

void LCG::setSeed(long newSeed)
{
seed = newSeed;

}LCG::LCG() {
setSeed(1);

}

LCG::~LCG() { }

float LCG::getNextRand() {
seed = (seed * a + c) % m;
return (float)seed / (float)m;
}

void LCG::countFrequency()
{for (int i = 0; i < 10; ++i)
frequencies[i] = 0;
for (int i = 0; i < m; ++i)
{
float u = getNextRand();
int r = ceil(u * 10.0);
frequencies[r] = frequencies[r] + 1;
}
}

void LCG::printFrequency()
{

for (int i = 0; i < 10; ++i)
{
const float rangeMin = (float)i / 10.0;
const float rangeMax = (float)(i + 1) / 10.0;
cout << "[" << rangeMin << ";" << rangeMax << "]"<< " | " << frequencies[i] << endl;
}
}

main.cpp:

int main()
{
LCG l;
l.countFrequency();
l.printFrequency();
}

Он правильно компилируется и линтируется, но не хочет запускаться. Я понятия не имею, что не так с моей программой. что-то не так с функциями countFrequency и printFrequency. Но я не могу понять, что. Может ты знаешь?

1

Решение

Эта часть неверна:

for (int i = 0; i < m; ++i)
frequencies[i] = 0;

На данный момент ваш frequencies пусто, и вы не можете получить доступ к его элементам, как это: индекс выходит за пределы допустимого, что вызывает сбой. Чтобы заполнить вектор, используйте push_back():

for (int i = 0; i < m; ++i)
frequencies.push_back(0);

Другие мелочи:

  • ваш конструктор делает слишком много работы:

    LCG::LCG() {
    setSeed(1);
    }
    

    правильный способ будет использовать списки инициализатора: LCG::LCG() : seed(1){ }

  • Если вы ничего не делаете в деструкторе, не определяйте его вообще, пусть компилятор сделает это за вас.

  • использование double вместо float для некоторой дополнительной точности; ceil работает doubleв любом случае.
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]