Генерация случайного числа

113
04 февраля 2021, 19:10

Сделал маленькую программу, которая генерирует случайное число, и пользователю нужно его угадать. Код:

#include <iostream>
#include <time.h>
using namespace std;
void random(int zagadanoe)
{
    zagadanoe = rand() % 10 + 1;
}
void main()
{
    setlocale(LC_ALL, "Rus");
    int zagadanoe;
    int vvedennoe;
    srand(time(NULL));
    cout << "Привет. Я сгенерировал тебе случайное число от 1 до 10. Угадай какое это число." << endl;
    cout << endl;
    zagadanoe = rand() % 10 + 1;
    cout << "Введи число: ";
    cin >> vvedennoe;
    cout << endl;
    while (zagadanoe != vvedennoe)
    {
        cout << "Не правильно. Пробуй еще, я загадал тебе новое число." << endl;
        cout << endl;
        random(zagadanoe);
        cin >> vvedennoe;
    }
    cout << "Ты угадал. Правильное число было = " << zagadanoe;
}

Программа генерирует случайное число от 1 до 10. Задался вопросом, как мне с помощью while или как нибудь по другому реализовать количество попыток для угадывания.

И еще проблема, в while. Когда мы неправильно вводим число, вызывается функция random(zagadanoe). Затем она генерирует случайное число (новое) идёт выход из функции, но, назад у while попадает прошлое число. Например, первое было сгенерировано 8, вызвалась функция random(zagadanoe) она сгенерировала 6, но по возвращению к while там осталась 8 (прошлое).

Расскажите, что я не так делаю?

Answer 1

Собственно, как нужно было сделать функцию random:

void random(int *zagadanoe)
{
    *zagadanoe = rand() % 10 + 1;
}

И как ее вызывать:

random(&zagadanoe);

Если в этих механизмах что-то остаётся неясным рекомендую изучать типы памяти и указатели.

Организовать количество попыток угадывания можно следюущим способом:

    int i = 0, attempts = 10; //i счётчик, attempts - количество попыток
    while (zagadanoe != vvedennoe && i < attempts) // используем логическое И
    //пока пользователь не отгадал и не исчерпал все попытки
    {
        i++; //в каждой итерации увеличиваем i на единицу
        cout << "Не правильно. Пробуй еще, я загадал тебе новое число." << endl;
        cout << endl;
        random(&zagadanoe); // решение проблемы с random
        cin >> vvedennoe;
    }

Конечно, подобное лучше реализовывать через цикл for:

    for (int i = 0; i < attempts && zagadanoe != vvedennoe; i++)
    {
        i++; //в каждой итерации увеличиваем i на единицу
        cout << "Не правильно. Пробуй еще, я загадал тебе новое число." << endl;
        cout << endl;
        random(&zagadanoe); // решение проблемы с random
        cin >> vvedennoe;
    }

Ну и... транслит зло.

Answer 2

ты передаешь параметр в функцию random по значению, а нужно по ссылке, вызов твоей функции не меняет значения аргумента

READ ALSO
Реализация алгоритма Сапера

Реализация алгоритма Сапера

Наткнулся в интернете на реализацию сапера, но сразу понял, что работает он немного не так, как нужно(А точнее открывает с одного клика почти...

127
Как сделать чат в глобальной сети c++ [закрыт]

Как сделать чат в глобальной сети c++ [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме

170
Заменить постояный вызов assert

Заменить постояный вызов assert

Можно как нибудь красивее написать?

127
Не правильно работает функция std::snprintf

Не правильно работает функция std::snprintf

Мне нужно чтобы выводилось Score: 0:0, а выводится так Score: 0Делаю так:

94