У меня была лаборатория, где мы должны были написать программу для имитации дуэли, для Аарона, у кого есть вероятность 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;
}
Компилятор сообщает вам, что 'operator%' не работает в двухместных. Вы даете ему двойной. Вам нужно ['modf'] (http://en.cppreference.com/w/cpp/numeric/math/modf). В следующий раз отправьте короткий пример, который воспроизводит проблему, а не * все * ваш код. – Borgleader
@Borgleader Ему не нужен 'modf'; довольно просто преобразовать результаты 'rand()' в значение с плавающей запятой в диапазоне '[0.0, 1.0)' и сравнить это с точностью. –
@JamesKanze «Мне нужен modf», я хотел применить модульную операцию для аргументов типа double ... Я не утверждаю, что знаю, что OP пытается достичь с помощью этого кода. – Borgleader