Я сделал тривиальную программу для моделирования прокатки 4-х сторонних кубиков и подсчета количества раз, сколько раз каждый номер подходит, чтобы я мог видеть, насколько случайным является rand(). Когда я просто печатаю результаты, единственными цифрами, которые появляются, являются числа 1-> 4, как и предполагалось. Когда я делаю подсчет, я заметил, что из 1000 итераций я только закончил ~ 700 тиков между 1 и 4. Зачем это было? Я чувствую, что ответ должен быть очевиден, потому что цикл работает по назначению, но я не вижу, где возникает проблема, когда я смотрю на подозрительную проблемную область моего кода.Неожиданные результаты при подсчете итоговых итогов
int d4()
{
int x;
x = rand() % 4 + 1;
return x;
}
int main()
{
int n1 = 0;
int n2 = 0;
int n3 = 0;
int n4 = 0;
int n5 = 0;
srand(time(0));
int x = 0;
while (x <= 100)
{
std::cout << d4() << " ";
++x;
/* ++x;
if (d4() == 1)
++n1;
else if (d4() == 2)
++n2;
else if (d4() == 3)
++n3;
else if (d4() == 4)
++n4;
else
++n5; */
}
std::cout << "Number 1 was rolled " << n1 << " times." << std::endl;
std::cout << "Number 2 was rolled " << n2 << " times." << std::endl;
std::cout << "Number 3 was rolled " << n3 << " times." << std::endl;
std::cout << "Number 4 was rolled " << n4 << " times." << std::endl;
std::cout << "Somehow some other number was rolled on a 4 sided die " << n5 << " times.";
std::cin.ignore();
std::cin.clear();
std::cin.get();
return 0;
}
Примечание. Я прокомментировал фрагмент таблицы, чтобы вручную просмотреть результаты.
В вашем длинном 'if ... else if' каскаде вы вызываете' d4() 'несколько раз. Каждый раз он возвращает различное случайное значение. Вот как вы попадаете в 'n5'. Вызовите его один раз на итерацию цикла, сохраните значение в переменной. –
Возможно, вы захотите сохранить результат в переменной и затем сравнить его значение. Подумайте, что произойдет, если вы скажете 'if (d4() == 1)', и это не так. Что происходит каждый раз, когда вы вызываете 'd4()'? Новое случайное число. –
Лучший способ сделать d4: 'std :: default_random_engine engine; std :: uniform_int_distribution форма (1,4); auto d4 = std :: bind (равномерный, движок); 'Тогда просто' val = d4(); 'Документация: http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution –
user4581301