Я делаю таблицу рулетки и хочу задать вопрос, но также получить помощь с кодом исправления.
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, в настоящее время я использую 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
Поскольку я считаю свою красную сельдь главной проблемой, я проигнорирую (если это то, что этот комментарий), линия
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
Я предполагаю, что это не то, что вы хотели, и предлагать флаг может быть лучшим способом, оставив печать после завершения цикла.