#include #include #include #include bool event_has_occured (double probability_of_event) { return (rand() / (RAND_MAX + 1.0)) < probability_of_event; } // returns true if team A wins and false otherwise bool run_one_tug_of_war (double initial_probability, double probability_increment, int distance_to_win, long &seconds) { int position = 0; double probability = initial_probability; seconds = 0; for (;;) { seconds++; if (event_has_occured (probability)) { position++; if (position >= distance_to_win) { return true; // team A has won } } else { position--; if (position <= -distance_to_win) { return false; // team B has won } } // update probability, maling sure that it never becomes // greater than one or less than zero. probability += probability_increment; if (probability > 1) { probability = 1; } else if (probability < 0) { probability = 0; } } } // returns probability (0 to 1) of team A winning. // also "returns" average length of all simulated contents. double run_many_tugs_of_war (long trials, double initial_probability, double probability_increment, int distance_to_win, double &average_time) { long i, seconds, victories = 0; double total_seconds = 0; for (i = 0; i < trials; i++) { if (run_one_tug_of_war (initial_probability, probability_increment, distance_to_win, seconds)) { victories++; // another win for team A } total_seconds += seconds; } average_time = total_seconds / trials; return ((double) victories) / trials; } void main (void) { double initial_probability, probability_increment, probability_of_winning, average_time; int distance_to_win; long trials; randomize(); for (;;) { cout << "\nEnter number of trials (zero to terminate): "; cin >> trials; if (!cin.fail() && trials == 0) { // valid input and zero entered - time to quit return; } // continue with the input process cout << "\nEnter initial probability and probability increment: "; cin >> initial_probability >> probability_increment; cout << "\nEnter distance to win: "; cin >> distance_to_win; if ( cin.fail() || (initial_probability < 0) || (initial_probability > 1) || (fabs(probability_increment) > 0.01) || (trials < 0) || (distance_to_win <= 0) ) { cout << "\n**** Invalid input ****" << endl; // clean up things in case we had total garbage cin.clear(); cin.ignore (INT_MAX, '\n'); } else { // valid data available - go ahead and do the computations probability_of_winning = run_many_tugs_of_war (trials, initial_probability, probability_increment, distance_to_win, average_time); cout << "\nThere is a " << probability_of_winning * 100 << " per cent chance of team A winning." << "\nThe expected duration of the tug of war is " << average_time << " seconds." << endl; } } }