C ++ Использование ctime для генератора случайных чисел, но получение того же числа - PullRequest
0 голосов
/ 03 сентября 2018

Я новичок и не до конца понимаю, что я делаю неправильно, используя ctime и переменные, которым присвоены случайные числа. Моя переменная newCard продолжает возвращать одно и то же значение каждый раз, когда я его вызываю. Любая обратная связь будет оценена!

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

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

int main()
{
    srand(static_cast<unsigned>(time(0)));

    int total = 0;
    int card1 = rand() % 10 + 1;
    int newCard = rand() % 10 +1;
    char deal, replay;

    do
    {   
         cout << " First Cards: " << card1 << ", " << newCard;
         total = card1 + newCard;
         cout << "\n Total: " << total;
         cout << "\n Do you want another card? (Y/N) ";
         cin >> deal;

         while(deal == 'y' || deal == 'Y')
         {
             cout << "\n New Card = " << newCard;
             total += newCard;
             cout << "\n Total: " << total;

            if(total == 21)
            {
                cout << "\n Congratulations!! BLACKJACK! ";
                cout << "\n Would you like to play again? (Y/N):";
                cin >> replay;
                break;
            }
            else if(total > 21)
            {
                cout << "\n BUST ";
                cout << "\n Would you like to play again? (Y/N):";
                cin >> replay;
                break;
            }

            cout << "\n Would you like another card? (Y/N): ";
            cin >> deal;
         }

         while (deal == 'n' || deal == 'N')
         {
             cout << "\n Would you like to play again? (Y/N): ";
             cin >> replay;
         }
    }
    while(replay == 'y' || replay == 'Y');

    while (replay =='n' || replay == 'N')
    {
        cout << "\n Exiting BlackJack \n\n";
        return 0;
    }
}

Ответы [ 3 ]

0 голосов
/ 03 сентября 2018
int card1 = rand() % 10 + 1;
int newCard = rand() % 10 +1;

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

Что вам нужно сделать, так это сгенерировать новую карту, если игрок наносит удар.

Это так же просто, как вставить строку в цикл:

 while(deal == 'y' || deal == 'Y')
 {
     newCard = rand() % 10 +1;              // <<<--- this one.
     cout << "\n New Card = " << newCard;
     :
}

(a) Не вполне правильно для Блэкджека, так как карт с десятью достоинствами больше, чем обычных карт (все 10 / J / Q / K имеют значение десять).

Лучше было бы использовать что-то вроде:

newCard = rand() % 13 + 1;
if (newCard > 10) newCard = 10;
0 голосов
/ 03 сентября 2018

Ваша проблема

Вы звоните rand() только один раз в начале, как это

int card1 = rand() % 10 + 1;
int newCard = rand() % 10 +1;

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

newCard = rand() % 10 +1;

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

Подсказка

То, что это еще не было упомянуто, здесь - хороший разговор о том, почему вы должны не использовать std::rand(). В то время как другие ответы также приведут к случайным числам, их распределение может быть отключено. C++ предоставляет лучший способ получения случайных чисел, и я предлагаю вам привыкнуть к нему как можно скорее.

std::random_device rd;  //Will be used to obtain a seed for the random number engine
std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
std::uniform_int_distribution<> dis(1, 10);

int newCard = dis(mt);

Для этого вам понадобятся следующие заголовки

#include <random>
#include <iostream>

Если вам нужна еще лучшая случайность, вы можете использовать random_device вместо генератора mt19937.

Поэтому я советую сделать это с самого начала и удалить rand() из вашего кода.

0 голосов
/ 03 сентября 2018

Если вы хотите сгенерировать случайное число, вам нужно позвонить rand().

Так вот:

int newCard = rand() % 10 +1;

Я бросаю 10-гранный кубик, он подходит к 5, поэтому я пишу 5 на листе бумаги с надписью newCard.

Теперь, каждый раз, когда я смотрю на свой лист бумаги с надписью newCard, он все равно говорит 5. Он не меняется каждый раз, когда я смотрю на него.

Если вы хотите перекатиться снова, вам нужно перекатиться снова и записать новый номер, выполнив это снова:

newCard = rand() % 10 +1;
...