2015-10-20 13 views
1

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

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. Но я не могу понять, что. Может быть, вы знаете?

+0

Это ваша полная программа? Если это так: вам нужна функция 'main'. Если нет, можете ли вы прояснить проблему? Как вы его скомпилируете? Что вы подразумеваете, говоря, что он «не хочет бегать»? Что происходит, когда вы пытаетесь запустить его? –

+0

Вы пробовали работать в отладчике? Что происходит тогда? –

+1

1. 'frequency' не имеет правильного размера, 2. Используйте' double', а не 'float', 3. Ditch that destructor. Пусть компилятор использует значение по умолчанию. – Bathsheba

ответ

2

Эта часть является неправильным:

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 s в любом случае.
+0

Большое спасибо !!!!! –

 Смежные вопросы

  • Нет связанных вопросов^_^