简体   繁体   中英

Generate random sport game result c++

I was required to write a program that generate random results of 10 sport games where 10 countries are involved, and display the medal tally based on the results.

I was able to generate the games' result but have no idea how to sum up the results (ie the number of different medals earned by each country).

Below is part of my code to generate random game result.

const string ctry[] = {'A','B','C','D','E','F','G','H','I','J'};  //country name

int main()
{
    string gctry[10];   //gold
    string sctry[10];   //silver
    string bctry[10];   //bronze

    for (int i = 0; i < 10; i++)
    {
        gctry[i] = country[(rand() + time(0))%10];
        sctry[i] = country[(rand() + time(0))%10];
        bctry[i] = country[(rand() + time(0))%10];
    }
}

I need some advice to solve this. Thanks.

You will need to go through the medal arrays and determine how many instances of each country there is in each array, so if you loop through the gold array.

How you do this is up to you.

Example if you loop through the GoldArray and find 3 instances of country "B" then they have 3 gold medals. You could provide a simple solution where you have a counter for each country.

int CountryAGoldM;

The each time you hit a country "A" in the array, you increment the CountryAGoldM by 1, I assume this is homework.

In future you will see other ways to rewrite this to be more efficiant but I assume you are just learning so a simple solution is always best in this case :P

You don't need to add time(0) to each rand() result. Instead use srand(time(0)) .

Your approach allows the same country to get more than one medal.

You can use a std::map to count the medals. No need to store any intermediate result in gctry, sctry and bctry.

您可以为此使用std :: count(),同时遍历各个国家/地区(尽管我更喜欢使用stl容器):

std::cout << country << ": gold " << std::count(gctry, gctry+10, country);

I know I shouldn't have done that, but sometimes you can learn by reading code ;)

#include <iostream>
#include <string>
#include <algorithm>
#include <map>
using namespace std;

int main()
{   
    const int nCountries = 7;
    string countries[nCountries] = { "C1", "C2", "C3", "C4", "C5", "C6", "C7" };
    map<string, int> goldMedals, silverMedals, bronzeMedals;

    const int nTrials = 10;

    for (int i = 0; i < nTrials; ++i)
    {
        // generate random results for current trial
        random_shuffle(countries, countries + nCountries);
        ++goldMedals  [countries[0]];
        ++silverMedals[countries[1]];
        ++bronzeMedals[countries[2]];

        //copy(countries, countries + nCountries, ostream_iterator<string>(cout, "\n"));
        //cout << "====================" << endl;
    }

    // sort by medals
    const int medalMultiplier = nTrials + 1;
    auto medalValue = [&](const string& c) 
    { 
        return goldMedals[c] * medalMultiplier * 2 + silverMedals[c] * medalMultiplier + bronzeMedals[c];
    };

    sort(countries, countries + nCountries, [&](const string& c1, const string& c2) { return medalValue(c1) > medalValue(c2); } );

    // output
    cout << "Results: \n";
    for (auto c = countries;  c != countries + nCountries; ++c)
    {
        cout << *c << " g" << goldMedals[*c] << " s" << silverMedals[*c] << " b" << bronzeMedals[*c] << endl;
    }
}

You have two problems to solve here. One of them you didn't mention:

Problem 1

You need to display sums of the number of medals won. These sums will be grouped up by country, and by type of medal, but will not be grouped by game.

You already have created a list of countries, and three arrays, one for each medal type. The index of those arrays is the game, and the value of those arrays is the country that won the medal in question.

Solution 1

One way to solve this would be to go through two nested loops.

For each country, start gold, silver, and bronze medal counters (inside the country loop).

Then, for each game, check if they were the winners of the gold, silver, or bronze, and if so, add one to the corresponding count. Once you're done with all the games, print out how many medals of each type that the current country won.

Then continue with the next country.

Problem 2

Can a country win two different medals in one game? If not, how would you solve this?

Solution 2

Since you didn't directly ask this question, I won't put a solution yet. But you could look to how you would generate a unique combinations (ala your probability math classes), and just pick a random combination. You'd want to do 10 pick 3.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM