我接受的问题看起来有点奇怪。
我想问的是:
int main(){
srand(time(NULL));
for(int x=0;x<10000;x++){
int result = rand()%2;
if(result==0) cout << "Heads" << endl;
if(result==1) cout << "Tails" << endl;
return 0;
}}
所以我想做的是模拟大量的硬币投掷。输出将如下所示:
Heads
Heads
Heads
Tails
Heads
Tails
Tails
....
但我想要一个像
这样的陈述头部总数= 4900,尾部= 5100最长头部条纹= 7,尾部 条纹= 8
在输出的顶部。我该怎么做?由于循环涉及cout
最好,我能够做的是将语句放在输出的底部。
编辑:我设法通过使用数组来解决问题。我首先使用循环并模拟抛出并通过将它们分配给数组元素来记录它们,然后按照我需要的顺序使用另一个循环打印它们。感谢所有答案,全部投票。
答案 0 :(得分:2)
最简单的解决方案是跟踪位集中的投掷结果,显示头部和尾部的数量,然后遍历位集,每个1的显示头和每个零的尾部。
答案 1 :(得分:2)
您真的需要继续打印Heads
,Tails
吗?
为什么不保留两个计数器。即。
int main(argc, char* argv[])
{
// Keep track of heads/tails counts
int heads = 0,
int tails = 0,
srand(time(NULL));
for (int x=0; x < 10000; x++){
int result = rand()%2;
if (result == 0) heads++;
if (result == 1) tails++;
}
// print results
printf("Heads=%d, Tails=%d otherstuff=TODO\n", heads, tails);
return 0;
}
跟踪其他变量的尾部或头部条纹。你需要 原点/尾部的最大值为零。还有一个变量可以说明当前的条纹长度是多少,以及你目前是否正在观察条纹或尾部条纹。
如果你真的想要打印头/尾你可以做像@Arthur Laks建议的那样的想法,或者使用一系列的char来让你不需要处理bitset。或者您可以将结果写入文件并将其读回,这相当丑陋。有很多方法可以做到这一点。
对于像这样的数组方法。
char* results = new char[10000];
char* p = results;
循环内部。表明头:
p[x] = 'H';
尾巴:
p[x] = 'T';
如果需要,您可以再次运行数组,以便在需要时计算其他统计模式。
这就是我要说的所有内容,因为我觉得如果我给你一个完整的答案,你就没有学到任何东西。
答案 2 :(得分:2)
您需要跟踪(存储)每次抛硬币的结果。折腾完成后,打印摘要,然后打印每枚硬币的结果。
由于每个硬币都是heads
或tails
,因此您可以将heads
表示为false
,将tails
表示为true。这允许您使用bool
的容器。
此外,只有两个值,因此您可以将它们表示为位。让我们说 head 是1而 tails 是零。 C ++语言有一个名为bitset
的结构,可以有效地存储这些位,直到完成抛掷。
打印结果时,通过bitset
容器迭代。如果值为1,则打印&#34; head&#34 ;;否则打印&#34; tails&#34;。简单。快。