C ++ Простая карточка умножения 0-10 с использованием rand ()

У меня проблемы с пониманием концепции rand () и srand () в С ++. Мне нужно создать программу, которая отображает два случайных числа, чтобы пользователь вводил ответ, затем сопоставлял ответ с сообщением и делал это 5 раз.

Мой вопрос в том, как мне его использовать, в инструкциях сказано, что я не могу использовать функцию time (), и это, кажется, есть в каждом онлайн-руководстве по rand ().

это то, что у меня есть до сих пор.

#include <iostream>
#include <cmath>
#include <cstdlib>

using namespace std;

int main()
{

int seed;
int response;

srand(1969);
seed=(rand()%10+1);

cout<<seed<<" * "<<seed<<" = ";
cin>>response;
cout<<response;
    if(response==seed*seed)
    cout<<"Correct!. you have correctly answered 1 out of 1."<<endl;
    else 
    cout<<"Wrong!. You have correctly answered 0 out of 1."<<endl;

Это просто выводит что-то вроде 6 * 6 или 7 * 7, я думал, что переменная seed не обязательно должна быть другой, но не всегда одинаковой?

Вот как должен выглядеть результат:

3 * 5 =
34
Wrongo. You have correctly answered 0 out of 1.
8 * 1 =
23
Wrongo. You have correctly answered 0 out of 2.
7 * 1 =
7
Correct! You have correctly answered 1 out of 3.
2 * 0 =
2
Wrongo. You have correctly answered 1 out of 4.
8 * 1 =
8
Correct! You have correctly answered 2 out of 5.

Final Results: You have correctly answered 2 out of 5 for a 40% average.

и это требования:

Ваша программа должна использовать rand () для генерации псевдослучайных чисел по мере необходимости. Вы можете использовать srand () для инициализации генератора случайных чисел, но, пожалуйста, не используйте какие-либо «автоматические» инициализаторы (например, функцию time ()), поскольку они могут зависеть от платформы. Ваша программа не должна использовать какие-либо циклы.


person user1314413    schedule 09.09.2012    source источник
comment
Ну, так как вы не можете засеять rand () со временем, можете ли вы попросить пользователя ввести число и использовать его как начальное или подобное?   -  person drescherjm    schedule 10.09.2012
comment
Или сделайте его аргументом командной строки.   -  person Aesthete    schedule 10.09.2012
comment
не используйте srand() и rand() в C ++. Используйте <random>, см. Ответ oldrinb.   -  person Walter    schedule 31.10.2013


Ответы (4)


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

Однако rand()%10+1 - это диапазон от 1 to 10, а не 0 to 10, как вы хотите.

ПОСЛЕ ИЗМЕНЕНИЯ

Чтобы получить желаемый результат, все, что вам нужно, это сделать два семечка следующим образом:

seed1=(rand()%11);
seed2=(rand()%11);
cout<<seed1<<" * "<<seed2<<" = ";

Кроме того, вы можете запросить у пользователя seed, а затем передать его srand, чтобы каждый запуск был более случайным.

О требованиях:

пожалуйста, не используйте какие-либо «автоматические» инициализаторы (например, функцию time ()), так как они могут зависеть от платформы.

std::time - это стандартная функция C ++ в заголовке <ctime>. Я не понимаю, почему это важно, если результат зависит от платформы.

Ваша программа не должна использовать какие-либо циклы.

Это тоже очень странное требование. Циклы - это фундаментальные строительные блоки любой программы. Требования кажутся мне очень странными, я бы попросил разъяснений у вашего профессора или преподавателя.

person Jesse Good    schedule 09.09.2012
comment
Когда число предсказуемо, оно не случайное, не так ли? - person Sani Singh Huttunen; 10.09.2012
comment
@SaniHuttunen: Да, это правда. Однако это число можно предсказать только в том случае, если вы запустите программу более одного раза. Возможно, это то, чего хочет ОП, но в описании проблемы это не уточняется. - person Jesse Good; 10.09.2012
comment
Ну ... для меня два случайных числа предполагают, что числа должны быть (псевдо) случайными при каждом запуске. Но могу ошибаться. - person Sani Singh Huttunen; 10.09.2012

Кстати, поскольку это C ++, вам действительно стоит стремиться использовать _1 _, например

#include <functional>
#include <random>
...
auto rand = std::bind(std::uniform_int_distribution<unsigned>(0, 10),
    std::default_random_engine());

Теперь вы можете просто использовать rand() для генерации числа в желаемом интервале.

person obataku    schedule 10.09.2012

В Windows вы можете использовать GetTickCount () вместо time ().
Вы можете использовать rand_s, который не нужно заполнять.
В системах * nix вы можете использовать / dev / random.

(Как использовать / dev / random)

person Sani Singh Huttunen    schedule 09.09.2012

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

Вы можете засеять рандом чем угодно. Вы обнаружите, что в большинстве руководств текущее время используется в качестве начального числа, поскольку возвращаемое число обычно различается при каждом запуске программы.

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

int main(int argc, char* argv[])
{
    srand(atoi(argv[1])); // Seed with command line argument.
}
person Aesthete    schedule 09.09.2012
comment
Я добавил предложенное решение. - person Aesthete; 10.09.2012
comment
Если вы знаете семя, вы можете предсказать числа. Это не случайно. - person Sani Singh Huttunen; 10.09.2012