2017-01-23 8 views
0

Я пытаюсь реализовать класс, который может генерировать псевдослучайную последовательность.Псевдослучайные целые числа

В качестве параметров конструктор должен иметь и начальное семя, множитель, приращение и модуль. Одна функция-член должна допускать изменение семени, одна функция должна генерировать и возвращать следующий номер в псевдослучайной последовательности.

Мои результаты ошибочны. Что я делаю неправильно, и какими должны быть правильные реализации.

Заголовочный файл для псевдослучайной последовательности:

#include<iostream> 
using namespace std; 

class pRandInt 
{ 
public: 
    pRandInt(); 

    //Default constructor with parameters 
    pRandInt(int, int, int, int); 

    //intial number in pseudorandom sequence 
    //permits the seed to be changed 
    void setFirstNum(int); 

    //generate the next number in the pseudorandom sequence 
    int getNextNum(); 

private: 
    int newSeed; 
    int newMulti; 
    int newIncr; 
    int newMod; 
}; 

файл реализации для псевдослучайной последовательности:

#include "pRandInt.h" 

pRandInt::pRandInt() 
{ 
    int newSeed = 0; 
    const int newMulti = 40; 
    const int newIncr = 725; 
    const int newMod = 729; 
} 

pRandInt::pRandInt(int seed, int multi, int incr, int mod) 
{ 
    newSeed = seed; 
    newMulti = multi; 
    newIncr = incr; 
    newMod = mod; 
} 

void pRandInt::setFirstNum(int seed) 
{ 
    newSeed = seed; 
} 

int pRandInt::getNextNum() 
{ 
    return (newMulti * newSeed + newIncr) % newMod; 
} 

Главный тестовый файл для псевдослучайной последовательности:

#include <iostream> 
#include "pRandInt.h" 

using namespace std; 
int main() 
{ 
    int seed = 0; 
    pRandInt num; 
    num.setFirstNum(seed); 
    cout << "The first number in your sequence is: "; 
    cin >> seed; 
    cout << "The other numbers in your sequence are: "; 
    cout << num.getNextNum() << endl; 
    system("pause"); 
    return 0; 
} 
+2

Для какого-то конкретного ввода, какие результаты вы ожидали и какие результаты вы действительно получили? Вы пробовали переходить через код в отладчике? Что касается «правильной реализации», это будет использовать [стандартную функциональность C++ PRNG] (http://en.cppreference.com/w/cpp/numeric/random) и не пытаться реализовать свои собственные. –

ответ

1

Ваша проблема заключается здесь:

int pRandInt::getNextNum() 
{ 
    return (newMulti * newSeed + newIncr) % newMod; 
} 

Если вы внимательно посмотрите на эту функцию и как она называется, вы не заметите, что ни одно из этих значений никогда не изменится . Обычно (некоторые говорят, что это необходимо), чтобы изменить один из них, если вы хотите увидеть другой выход.

Мое предложение было бы смотреть в семенах :-)


Шорт фактически писать код для вас (что-то я склоняюсь к неодобрительно при попытке ответить, очевидно, образовательные вопросы по SO), это о такой же помощи, какой я могу дать. Однако это должно быть больше, чем достаточно для вас, чтобы решить эту проблему самостоятельно.

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