Случайные числа и логика программирования

У меня возникли проблемы с заданием ниже.

«Напишите программу, которая генерирует случайное целое число в диапазоне от 1 до 100, а затем просит пользователя угадать, что это за число. Если предположение пользователя больше, чем случайное число, программа должна отображать «Слишком много, попробуйте еще раз». Если предположение пользователя меньше, чем случайное число, программа должна отобразить «Слишком мало, попробуйте еще раз». Программа должна использовать цикл, который повторяется до тех пор, пока пользователь правильно не угадает случайное число».

Как мне заставить работать случайные числа, и есть ли лучший/более эффективный способ записи каких-либо частей? Я все еще изучаю С++

Вот мой код

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int main()
{
    // declare variables
    int rightAnswer, userAnswer;

    // determine rightAnswer
    srand (time(NULL));
    rightAnswer = (rand() % 100) + 1;

    // begin the game
    cout << "I'm thinking of a number between 1-100!" << endl;
    do{
        // collect data
        cout << "Guess: ";
        cin >> userAnswer;

        // if else statements to determine correctness
        if (userAnswer < 1 || userAnswer > 100)
            cout << "The number is in the range 1-100. Try again!" << endl;
        else if (userAnswer > rightAnswer)
            cout << "Too high! Try again!" << endl;
        else if (userAnswer < rightAnswer)
            cout << "Too low! Try again!" << endl;
        else
            cout << "That's it! Good job!" << endl << ":)";


    } while (userAnswer != rightAnswer);
    return 0;
}

person republikunt    schedule 02.01.2015    source источник
comment
Непонятно, на что вы надеетесь, что SO даст вам. Код на первый взгляд выглядит функциональным. Где ломается?   -  person Steven Hansen    schedule 02.01.2015
comment
Это выглядит достаточно хорошо, за исключением того, что случайное число не выбирается равномерно в заданном диапазоне. Вы видите какие-либо проблемы.   -  person Mohit Jain    schedule 02.01.2015
comment
Ваша программа корректно работает в моей системе.   -  person Ali786    schedule 02.01.2015
comment
Это работает? Мой отображает огромную страницу с ошибками, не знаю, как это назвать. Я забыл упомянуть, что я программирую с Mac и Xcode, повлияет ли это на это?   -  person republikunt    schedule 02.01.2015
comment
Когда вы говорите, что это работает, вы имеете в виду именно то, что описывает проблема?   -  person republikunt    schedule 02.01.2015


Ответы (1)


В c++11 вы можете генерировать случайные числа более равномерно в заданном диапазоне, используя правильный выбор распределения случайных чисел. Один из примеров использования равномерного распределения показан ниже:

#include <random>

...
std::random_device rd; // obtain a random number
std::mt19937 engine(rd());
std::uniform_int_distribution<> distribution(1, 100); // define the range

const int rightanswer = distribution(engine);
person Mohit Jain    schedule 02.01.2015
comment
Есть ли способ использовать его без двигателей? Я почти уверен, что мы должны использовать ранд и ранд. Я просто не вижу, как они работают в целом - person republikunt; 02.01.2015
comment
Лучшее, что я могу предложить для вашей цели с rand, это: do {rightAnswer = rand() % 128;}while(rightAnswer >= 100)++rightAnswer;. Если вам разрешено использовать современные C++, отдайте предпочтение методу, предложенному в ответе. - person Mohit Jain; 02.01.2015
comment
почему установить rightAnswer выше диапазона и почему % 28? а также почему ++правильный ответ - person republikunt; 02.01.2015
comment
Потому что, если модуль (100 в вашем случае и 128 в моем случае) не равен степени 2, вы получите неравномерное распределение. Пример в комментарии равномерно генерирует число (при условии, что rand генерирует однородное число) в диапазоне [0, 127] и игнорирует, если оно больше 99. Затем он преобразует [0-99] в [1-100], добавляя . Посмотрите это видео на YouTube, чтобы понять, почему rand вреден. - person Mohit Jain; 02.01.2015