2015-09-19 2 views
0

Я сделал тривиальную программу для моделирования прокатки 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; 
} 

Примечание. Я прокомментировал фрагмент таблицы, чтобы вручную просмотреть результаты.

+3

В вашем длинном 'if ... else if' каскаде вы вызываете' d4() 'несколько раз. Каждый раз он возвращает различное случайное значение. Вот как вы попадаете в 'n5'. Вызовите его один раз на итерацию цикла, сохраните значение в переменной. –

+1

Возможно, вы захотите сохранить результат в переменной и затем сравнить его значение. Подумайте, что произойдет, если вы скажете 'if (d4() == 1)', и это не так. Что происходит каждый раз, когда вы вызываете 'd4()'? Новое случайное число. –

+0

Лучший способ сделать 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

ответ

1

Как вы указали в комментариях, ваша проблема в том, что каждый раз, когда вы вызываете d4(), он возвращает другой результат между 1 и 4 (включительно). Это может означать, что в вашем цикле возврат d4() никогда не заканчивается равным сравниваемому значению во время сравнения. Рассмотрим:

if (d4() == 1) // call d4(), which returns 2 
     ++n1; 
    else if (d4() == 2) // call d4() again, which returns 3 
     ++n2; 
    else if (d4() == 3) // call d4() again, which returns 1 
     ++n3; 
    else if (d4() == 4) // call d4() again, which returns 2 
     ++n4; 
    else 
     ++n5; // No other comparison worked, so this is incremented instead. 

Решение здесь, чтобы вызывать только d4() раз и сохранить его значение в переменной.

// Retrieve the random number this loop iteration and store its value 
int randomNumber = d4(); 
std::cout << randomNumber << std::endl; 

if (randomNumber == 1) 
    ++n1; 
else if (randomNumber == 2) 
    ++n2; 
else if (randomNumber == 3) 
    ++n3; 
else if (randomNumber == 4) 
    ++n4; 
else 
    ++n5; 
+0

Плюс' rand ()% 4' does_not_ имеют четное распределение. OP необходимо выполнить базовое фоновое чтение на PRNG и по модулю арифметики. –

+0

Молния, идея состояла в том, чтобы сделать тривиальную программу, чтобы увидеть, как работает даже rand(). ОП осознает слабое знание недостатков rand(). Я делаю эту программу не потому, что я недостаточно умею читать, а потому, что это был пример того, что я могу написать, чтобы помочь мне изучить C++. –

Смежные вопросы