2014-10-09 5 views
-1

У меня была лаборатория, где мы должны были написать программу для имитации дуэли, для Аарона, у кого есть вероятность 1/3, Боб 1/2, Чарли никогда не промахивается. Программа должна использовать случайные числа и вероятности, заданные в задаче, чтобы определить, ударил ли стрелок своей цели, имитирует 10 000 дуэлей.Как я могу получить rand, чтобы дать мне правильный номер с использованием точности?

Первый раз с рандом и с некоторыми проблемами с моими функциями мой профессор сказал, чтобы я поставил точность%, поэтому вам понадобится только одна функция, и она будет вводить точность игроков из вызова функции, но я получаю сообщение об ошибке : недопустимые операнды типов int' and double 'to binary `operator%', я смущен, потому что точность - это число.

У меня также возникли проблемы с циклом while, потому что «бойцы» должны только вычитать его, когда игрок снимается, и будут моменты, когда игрок не снимается.

#include <iostream> 
#include <stdlib.h> 
#include <cstdlib> 
#include <ctime> 

using namespace std; 

double rand1 (double accuracy); 
bool aaron_shoot (double a, bool& charlie, bool& bob); 
bool bob_shoot(double b, bool& charlie, bool& aaron); 
bool charlie_shoot (double c, bool& bob, bool& aaron); 

int main() { 

bool aaron, bob, charlie; 
int aaron_wins = 0, bob_wins = 0, charlie_wins = 0; 
srand(time(0)); 

    for (int battles = 1; battles <= 10000; battles++){ 

     int fighters = 3; 
     while (fighters > 1){ 
     aaron = aaron_shoot(0.333, charlie, bob);   
     bob = bob_shoot (0.5, charlie, aaron);  
     charlie = charlie_shoot (1.0, bob, aaron); 
     //need an argument to make sure a shooter does not shoot if they are dead, and to count    how many are left if there is a hit 
} //keeps track of the win at the end of each round of battles when 
    //there is one player left standing  
     aaron_wins = aaron_wins + aaron; 
     bob_wins = bob_wins + bob;   
     charlie_wins = charlie_wins + charlie;   
} 
cout << "Aaron won " << aaron_wins<< "/10000 duels or " << (aaron_wins/100)<< "%.\n"; 
cout << "Bob won " << bob_wins << "/10000 duels or " << (bob_wins/100)<<"%.\n"; 
cout << "Charlie won " << charlie_wins << "/10000 duels or " << (charlie_wins/100)<<"%.\n"; 

system ("Pause"); 
return 0; 

} 


bool aaron_shoot (double a, bool& charlie, bool& bob){ 
if (charlie == true){ //is alive 
      if (rand1 (a) >= a){ 
         return (charlie = false);       
         } 
      } 
else if (bob == true){ 
       if (rand1 (a) >= a){ 
         return (bob = false); 

         } 
       }   
} 

bool bob_shoot (double b, bool& charlie, bool& aaron){ 
if (charlie == true){ 
      if (rand1 (b) >= b){ 
         return (charlie = false); 

         } 
      } 
else if (aaron == true){ 
       if (rand1 (b) >= b){ 
         return (aaron = false); 

         } 
       }  
} 

bool charlie_shoot (double c, bool& bob, bool& aaron){ 
if (bob == true){ 
      if (rand1 (c) >= c){ 
         return (bob = false); 
         } 
      } 
else if (aaron == true){ 
       if (rand1 (c) >= c){ 
         return (aaron = false); 

         } 
       }   
} 

double rand1 (double accuracy){ 
    double r = rand();    
    return (r/RAND_MAX) < accuracy; 

}   
+4

Компилятор сообщает вам, что 'operator%' не работает в двухместных. Вы даете ему двойной. Вам нужно ['modf'] (http://en.cppreference.com/w/cpp/numeric/math/modf). В следующий раз отправьте короткий пример, который воспроизводит проблему, а не * все * ваш код. – Borgleader

+0

@Borgleader Ему не нужен 'modf'; довольно просто преобразовать результаты 'rand()' в значение с плавающей запятой в диапазоне '[0.0, 1.0)' и сравнить это с точностью. –

+0

@JamesKanze «Мне нужен modf», я хотел применить модульную операцию для аргументов типа double ... Я не утверждаю, что знаю, что OP пытается достичь с помощью этого кода. – Borgleader

ответ

0
double rand1 (double accuracy){ 
    srand(time(0)); 
    int a = rand()% accuracy; <-- THIS 
    double b = ((double)a/RAND_MAX); 
    return b; 
} 

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

double r = rand(); 
    if ((r/RAND_MAX) < accuracy) 

Кроме того, не называйте более srand, чем один раз. В противном случае два вызова rand1 в ту же секунду получат одинаковое возвращаемое значение от rand.

+0

Спасибо, так будет ли функция выглядеть примерно так? double rand1 (двойная точность) { double r = rand(); if ((r/RAND_MAX) <точность) { return r; } } – Csci319

+0

Я предлагаю вернуть bool, так что 'return (r/RAND_MAX) <точность;'. –

+0

большое спасибо. Он работает сейчас. Я просто не могу понять, как исправить цикл while. какие-либо предложения? – Csci319

0

Вы не можете использовать modulo с помощью double. Существует несколько способов использования , но если точность всегда 1 над малым целым числом a, вы можете сделать rand() % a == 0, чтобы узнать, не попадает ли он. В противном случае, вы должны сначала преобразовать результаты rand() в в double в диапазоне [0.0, 1.0), по rand()/(RAND_MAX + 1.0, , а затем, если указанная точность больше, чем она является промаха.