Top.Mail.Ru
Ответы
Аватар пользователя
6мес
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+4

Функция rand зациклилась / рулетка на C++

пишу программу в целях практики. Смысл программы - рулетка как в казино, ставки на цвет.
Все предельно просто, задаются переменные, функция рандом выбирает 0 или 1, а после результат сравнивается с тем, что выбрал пользователь, шанс выиграть - 50/50. Если выбор пользователя равен числу функции rand() - выводим победное сообщение и начисляем баллы, иначе - баллы вычитаем.
Единственная проблема - одинаковый результат при выборе цвета. Т.е. выбирая красный игрок проиграет 100%, выбирая черный - выиграет. С чем это связанно я так и не понял.
Как исправить эту проблему, чтобы результат действительно был рандомным?

КОД:

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

int main() {
setlocale(LC_ALL, "RU");
srand(time(NULL));
int many = 1000;
int mode;
int Icolor;
int RandColor = rand() % 2;
int start;

cout << "сыграть в рулетку?\n";
cout << "0 - выйти\n";
cout << "1 - играть\n";
cin >> start;
if (start < 1) {
cout << "выход из программы...";
}
else {
while (start > 0) {
cout << "выберете цвет\n";
cout << "0 - красный\n";
cout << "1 - черный\n";
cin >> Icolor;

if (Icolor == RandColor) {
many = many + 100;
cout << "вы выиграли!\n";
cout << "ваш баланс " << many << std::endl;
}
else {
many = many - 100;
cout << "вы проиграли!\n";
cout << "ваш баланс " << many << std::endl;
}

cout << "продолжить?\n";
cout << "0 - выйти\n";
cout << "1 - играть\n";
cin >> start;

}

}
return 0;
}

По дате
По рейтингу
Аватар пользователя
Высший разум
6мес
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
 #include <array> 
#include <iostream> 
#include <random>
#include <string>

using namespace std;

class Roulette { 
public: 
    Roulette() { 
        random_device device; 
        gen.seed(device()); 
    } 
    bool bet_on_color(int bet) { 
        const auto result = uniform(); 
        number = wheel[result]; 
        if (!result) color = 0; 
        color = result & 1 ? 1 : 2; 
        return color == bet; 
    } 
private: 
    int color = -1; 
    int number = -1; 
    inline static const array<int, 37> wheel{ 
        0, 32, 15, 19, 4, 21, 2, 25, 17, 34, 
        6, 27, 13, 36, 11, 30, 8, 23, 10, 5, 
        24, 16, 33, 1, 20, 14, 31, 9, 22,18, 
        29, 7, 28, 12, 35, 3, 26 
    }; 
    mt19937 gen; 
    int uniform() { 
        static constexpr auto last = 36; 
        uniform_int_distribution<int> uid(0, last); 
        return uid(gen); 
    } 
    friend ostream& operator<<(ostream& out, const Roulette& roulette) { 
        if (roulette.color == -1) return out << "Error"; 
        if (!roulette.color) return out << "Zero"; 
        return out << (roulette.color & 1 ? "Red " : "Black ") + to_string(roulette.number); 
    } 
};

int main() { 
    Roulette roulette; 
    while (true) { 
        puts("0 -> Exit"); 
        puts("1 -> Red"); 
        puts("2 -> Black"); 
        cout << ">>> "; 
        int bet; 
        cin >> bet; 
        if (!bet) break; 
        const auto result = roulette.bet_on_color(bet); 
        cout << roulette << " -> "; 
        puts(result ? "Win" : "Loss"); 
    } 
} 
Аватар пользователя
Высший разум
6мес
1234
 cin >> Icolor;
RandColor = rand() % 2; // случайный цвет надо генерировать здесь, а не один раз в начале программы
if (Icolor == RandColor) {
... 
Аватар пользователя
Искусственный Интеллект
6мес

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

Чтобы исправить проблему и сделать результат действительно случайным, нужно перемещать генерацию случайного числа внутрь цикла while. Это позволит обновлять значение RandColor при каждой итерации цикла.

Правильный код здесь
https://dpaste.com/AE6WGTMY4#wrap

Внесенные изменения:
Перенос генерации случайного числа: Переменная RandColor = rand() % 2 перенесена внутрь цикла while, чтобы она обновлялась при каждом новом раунде.

Логика осталась неизменной, за исключением устранения ошибки с предсказуемым результатом.

Результат:
Теперь результат игры действительно случайный, и у игрока будет шанс 50/50 выиграть или проиграть в каждом раунде.

Аватар пользователя
Просветленный
6мес

Во-первых, это не то, как пишется money. Во-вторых, проверь в первую очередь правильно ли задал генератор рандома. Лучшим вариантом тут будет сделать вывод отдельной строкой значение, которое из него выпало, для дебага, косяк где-то там, и уже по тому, что он покажет, судить.

И обычно сравнение деалется в таких случаях не через равно, а больше/меньше, и работают по диапазону, но это лирика.