2-й вызов srand () в той же программе с тем же семенем НЕ дает одинаковые значения для последовательного rand ()

Я работаю над простой программой "дополнительных вопросов" для моего введения в класс C ++. Мой инструктор использует тестовый драйвер для оценки нашего кода. Драйвер тестирования сначала запускает программу, используя свой код, а затем запускает мою функцию и сравнивает их.

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

Насколько я понимаю, srand () сгенерирует тот же список чисел, если семя такое же. Проблема, с которой я столкнулся, заключается в том, что даже несмотря на то, что я помещаю srand (seed) в начало моей функции, последовательные числа, генерируемые каждым вызовом rand (), по-прежнему разные. Насколько я понял, если вы вспомните srand с тем же семенем, он сбросит генератор чисел и даст вам ту же цепочку чисел из rand ().

Поскольку он использует тестовый драйвер для оценки, драйвер говорит мне, что почти все мои результаты неверны, но это потому, что драйвер на самом деле не вычисляет мои случайные сгенерированные числа, он просто ищет те же ответы, что и в его версии. программы. Итак, проблема в том, что по какой-то причине при вызове srand (seed) используются разные числа.

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

Может ли кто-нибудь подтвердить, что использование srand (seed) в моем коде будет сброшено и использовать те же числа, если это начальное значение такое же?

Вот моя функция:

int correct = 0;  // initialize global variable to return correct answers
// define the additionQuestions function.

int additionQuestions(int largest, int problemCount, int seed)
{
    srand(seed);  // initialize the random generator to the same seed used in test driver
    int gen1, gen2, answer;
    bool quitting = false;

    // generate problems
for (int count = 0; count < problemCount && (!(quitting)); count++)
{
    gen1 = rand() % largest;
    gen2 = rand() % largest;

    cout << "How much is " << gen1 << " plus " << gen2 << "? ";
    cin >> answer;
    if (answer == -1)  // check for sentinel of -1
    {
        cout << endl << "  You entered -1; exiting...";
        quitting = true;

    }
    else  // check if the user's answer is correct.
    {
        cout << endl << "  You said " << gen1 << "+ " << gen2 << " = " << answer << ".";
        if (answer == gen1 + gen2)
        {
            cout << " Very good!" << endl;
            correct += 1;
        }
        else
        {
            cout << " No. Sorry, the correct answer is " << gen1 + gen2 << "." << endl;
        }
    }
} // end of for loop.
return correct;  // return the number of correct answers to the main function
}

person Sabien    schedule 03.03.2014    source источник
comment
Не могли бы вы показать первые несколько строк распечатки из «addQuestion (..., 5)» и «addQuestion (..., 5)», чтобы показать, что список сгенерированных чисел отличается?   -  person John Yost    schedule 03.03.2014
comment
Ваш код действительно выглядит правильным. Я ожидал, что ошибка будет связана с тем, как программа тестового вождения дает вам семя.   -  person ojblass    schedule 03.03.2014
comment
@jcyost Это натолкнуло меня на идею создать мою собственную основную функцию, которая вызывала бы две копии моей функции и сравнивала их, поэтому srand (seed) использовалось в программе дважды. Вторая функция фактически выдает те же числа, поэтому похоже, что srand (seed) работает должным образом. Как заметил ojblass, я предполагаю, что проблема должна быть в тестовом драйвере. Пора написать моему инструктору по электронной почте. Спасибо ребята.   -  person Sabien    schedule 03.03.2014


Ответы (1)


Прежде чем писать своему профессору .... Вы используете неявное приведение типа от 'int seed' к 'srand (unsigned int seed)', что может вызвать проблемы, когда тестовый драйвер пытается протестировать вашу программу с семенем больше ~ 2,1M .

Удачи.

person John Yost    schedule 03.03.2014
comment
Если это так, будет ли моя тестовая программа нарушена? Значение начального числа, которое я использовал в своей тестовой программе, было 31451256132987124987. Это начальное значение было передано в две мои функции, которые являются копиями друг друга, и оно по-прежнему работало нормально. - person Sabien; 03.03.2014
comment
На самом деле моя логика обратная, извините. Проблема не в том, чтобы передать большое число в srand, если оно положительное. Проблема будет в том, что драйвер, тестирующий вашу библиотеку, передает беззнаковое int в качестве семени. Затем приведение происходит по мере передачи семени. Мы - типы переменных для вашей функции, предоставленные вам? - person John Yost; 03.03.2014
comment
Да, он сказал, что наша функция должна принимать три аргумента типа int. Я спросил его об этом, и он ответил, что функция srand () должна вызываться с предоставленным аргументом начального числа ровно один раз в начале вашей функции. Он должен быть вызван до того, как вы сделаете какие-либо вызовы rand (). на что я ответил, что сделал именно это (как вы можете видеть выше), и я все еще жду его ответа. - person Sabien; 03.03.2014
comment
Тогда я думаю, что ты золотой. Надеюсь, ты найдешь проблему на его стороне. - person John Yost; 03.03.2014