Случайное число рулетки и оператор if c ++

0

Я делаю таблицу рулетки и хочу задать вопрос, но также получить помощь с кодом исправления.

1, в настоящее время я использую rand()% 37 в качестве генератора случайных чисел для чисел 0-36. Есть ли лучший генератор, который дает более случайное число?

2, я не уверен, как проверять значения в массиве против оператора if. (см. код ниже)

int red[18] = {1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36};

int main ()
{

srand(time(NULL));
r = rand() % 3;
cout << r << endl;
for(int i = 0; i<18; i++)
    if (r==red[i])
    {
        cout << "hello" << endl;
        break;
    }
    else 
    {
        cout << "bye" << endl;
        break;
    }
return 0;
}

Когда я запускаю этот код, он возвращается, даже если r (случайное число) находится в массиве красного цвета.

Для woolstar: это упрощенная версия моего реального кода. Я хочу создать случайное число (r), а затем проверить это число на красный массив, если r находится в массиве, я хочу, чтобы он считался истинным и печатал привет в этом случае

Например, r = 14, равно 14 в красном массиве? Да: распечатать привет

Редактирование: вот мой фактический код, при запуске случайного числа и поиска в случае B и C он возвращается с ошибками, говоря: инициализация пропускает метки меток

// Random number generator
random_device rd;
mt19937 gen (rd());

uniform_int_distribution<>
dis  (0, 36);

switch (play_method)
    {
        case 1:                                     // Color Play
        cout << "A - Play Red.\n";
        cout << "B - Play Black.\n";
        cout << "C - Play Green.\n";
        cout << "Which color will you bet on?" << endl;
        cin >> color;

        switch (color)
        {
            case 'A':                               // Red Play
                    int rred = dis(gen);
                    auto

                it = find(begin(red),end(red), rred);
                    if(it!=end(red))
                    {
                        win_amt = bet_amt*2;
                        total_amt = total_amt + (win_amt - bet_amt);
                        cout << "Congratulations you rolled a " << r << " and have won: $" << win_amt << "!" << endl;
                        cout << "You now have: $" << total_amt << " remaining." << endl;
                    }
                    else
                    {
                        total_amt = total_amt - bet_amt;
                        cout << "Unlucky, you rolled a " << r << " and have have lost  $" << bet_amt << endl;
                        cout << "You have $ " << total_amt << " remaining." << endl;
                    }           // Red play if/else end                 
            break;                                  // Break for case A: Red play

             case 'B':                              // Black play
                    int rblack = dis(gen);
                    auto

                it1 = find(begin(black),end(black), rblack);
                    if(it1!=end(black))
                    {
                        win_amt = bet_amt*2;
                        total_amt = total_amt + (win_amt - bet_amt);
                        cout << "Congratulations you rolled a " << r << " and have won: $" << win_amt << "!" << endl;
                        cout << "You now have: $" << total_amt << " remaining." << endl;
                    }
                    else
                    {
                        total_amt = total_amt - bet_amt;
                        cout << "Unlucky, you rolled a " << r << " and have have lost  $" << bet_amt << endl;
                        cout << "You have $ " << total_amt << " remaining." << endl;
                    }                   // Black play if/else end 

            break;                      // Break for case B: Black play 

            case 'C':
                int rgreen = dis(gen);
                    auto

                it2 = find(begin(green),end(green), rgreen);
                    if(it1!=end(green))
                    {
                        win_amt = bet_amt*37;
                        total_amt = total_amt + (win_amt - bet_amt);
                        cout << "Congratulations you rolled a " << r << " and have won: $" << win_amt << "!" << endl;
                        cout << "You now have: $" << total_amt << " remaining." << endl;
                    }
                    else
                    {
                        total_amt = total_amt - bet_amt;
                        cout << "Unlucky, you rolled a " << r << " and have have lost  $" << bet_amt << endl;
                        cout << "You have $ " << total_amt << " remaining." << endl;
                    }                   // Green play if/else end */
            break;

        }                               // Switch color end
        break;                          // break for case 1: Color play
  • 1
    Что вы хотите, чтобы ваша программа делала?
Теги:

2 ответа

3
Лучший ответ

1, в настоящее время я использую rand()% 37 в качестве генератора случайных чисел для чисел 0-36. Есть ли лучший генератор, который дает более случайное число?

Да, конечно. Пожалуйста, рассмотрите возможность использования случайных номеров С++ 11 (или Boost.Random, если у вас нет С++ 11).

std::random_device rd;     
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis { 0, 36 };

//print random number between 0 and 36
std::cout << dis(gen);

См. Следующую ссылку:

http://en.cppreference.com/w/cpp/numeric/random

2, я не уверен, как проверять значения в массиве против оператора if. (см. код ниже)

Я бы использовал std::find

#include <random>
#include <iostream>
#include <algorithm>

int red[18] = {1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36};

int main () {
    std::random_device rd;     
    std::mt19937 gen { rd() };
    std::uniform_int_distribution<> dis { 0, 36 };
    int r=dis(gen);
    auto it=std::find(std::begin(red), std::end(red), r);
    if(it!=std::end(red)) {
        std::cout << "hello\n";
    }
    else {
        std::cout << "hello\n";
    }
    return 0;
}

См. Следующую ссылку:

http://en.cppreference.com/w/cpp/algorithm/find

РЕДАКТИРОВАТЬ См. Также:

Надеюсь, это будет достаточно убедительно, чтобы расколоть rand().

http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful

  • 0
    Я использовал поиск и генератор случайных чисел и отлично работал на 1 случай. Поскольку я делаю таблицу рулетки, у меня будет несколько случаев. Можете ли вы показать мне, как использовать это в 2 случаях, т.е. массив красного цвета и массив черного цвета? Если вы хотите, чтобы я выставил свой правильный код только для цветного случая, который я сделаю, то я буду повторять это еще много раз! Я спрашиваю об этом, потому что я попытался использовать то же самое снова для второго случая (тот же формат, что и в первом случае) и вернулся со многими ошибками!
2

Поскольку я считаю свою красную сельдь главной проблемой, я проигнорирую (если это то, что этот комментарий), линия

r = rand() % 3;

Если r равно 1, приветствие будет напечатано. иначе else выполняется первым. Это печатает и разбивает цикл.

В этом случае for никогда не может пропустить одну итерацию цикла, поскольку оператор break в обоих предложениях if - его легче увидеть, если вы напишете цикл таким образом (я настоятельно рекомендую вам привыкнуть чаще использовать круглые скобки)

for(int i = 0; i<18; i++)
{
    if (r==red[i])
    {
        cout << "hello" << endl;
    }
    else 
    {
        cout << "bye" << endl;
    }
    break;
}
return 0;

который по существу делает это

for(int i = 0; i<18; i++)
{
    // do something not affecting flow control
    break;
}
return 0;

который

int i =0; 
// do something not affecting flow control

Я предполагаю, что это не то, что вы хотели, и предлагать флаг может быть лучшим способом, оставив печать после завершения цикла.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню