[英]Generate random sport game result c++
我被要求编写一个程序,以生成涉及10个国家/地区的10个体育比赛的随机结果,并根据结果显示奖牌总数。
我能够生成游戏的结果,但不知道如何总结结果(即每个国家获得的不同奖牌的数量)。
以下是我生成随机游戏结果的代码的一部分。
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];
}
}
我需要一些建议来解决这个问题。 谢谢。
您将需要遍历奖牌阵列并确定每个阵列中每个国家有多少个实例,因此如果您遍历金牌阵列。
如何执行此操作取决于您。
例如,如果您遍历GoldArray并找到3个国家“ B”的实例,那么它们就有3枚金牌。 您可以提供一个简单的解决方案,其中每个国家都有一个柜台。
int CountryAGoldM;
每次您击中数组中的国家“ A”时,都会将CountryAGoldM加1,我认为这是家庭作业。
将来,您将看到其他方法来更有效地重写它,但我认为您只是在学习,因此在这种情况下,简单的解决方案始终是最好的:P
您无需在每个rand()结果中添加time(0)。 而是使用srand(time(0))
。
您的方法可以使同一国家获得多个奖牌。
您可以使用std :: map来计数奖牌。 无需将任何中间结果存储在gctry,sctry和bctry中。
您可以为此使用std :: count(),同时遍历各个国家/地区(尽管我更喜欢使用stl容器):
std::cout << country << ": gold " << std::count(gctry, gctry+10, country);
我知道我不应该这样做,但是有时候您可以通过阅读代码来学习;)
#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;
}
}
您有两个要解决的问题。 您没有提到其中一个:
问题1
您需要显示获得的奖牌总数。 这些金额将按国家/地区和奖牌类型分组,但不会按游戏分组。
您已经创建了国家列表和三个阵列,每种奖牌类型一个。 这些数组的索引是游戏,而这些数组的值是赢得相关奖牌的国家/地区。
解决方案1
解决此问题的一种方法是遍历两个嵌套循环。
对于每个国家/地区,在国家/地区循环中启动金牌,银牌和铜牌的计数器。
然后,对于每场比赛,检查他们是否是金牌,银牌或铜牌的获胜者,如果是,则将其加到相应的计数中。 完成所有游戏后,请打印出当前国家/地区赢得的每种类型的奖牌数。
然后继续下一个国家。
问题2
一个国家能否在一场比赛中赢得两枚不同的奖牌? 如果没有,您将如何解决?
解决方案2
由于您没有直接提出这个问题,所以我不会提出解决方案。 但是您可以考虑如何生成唯一的组合(例如概率数学类),然后选择一个随机组合。 您想做10选3。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.