C++ 在C+中的特定组大小中检查相同的生日+;
我对这个网站是全新的。一位朋友告诉我这件事,以及这件事对他有多大的帮助,现在就开始吧 我正试图创建一个程序,将在一定规模的群体阅读。此时,它将为组中的每个“成员”创建随机的生日(1-365天),然后进行比较,查看该组中是否有相同的生日。该程序将对给定的组大小进行10000次比较,并跟踪其中有多少试验产生了相同的生日,并返回10000次试验中有匹配的百分比 我遇到的问题是,这个程序只会返回100%,而每次连续运行都会加倍。因此,如果用户决定使用不同的组大小再次运行,那么答案会变成“200%”,然后是“300%”,依此类推 在此方面的任何帮助都将不胜感激C++ 在C+中的特定组大小中检查相同的生日+;,c++,C++,我对这个网站是全新的。一位朋友告诉我这件事,以及这件事对他有多大的帮助,现在就开始吧 我正试图创建一个程序,将在一定规模的群体阅读。此时,它将为组中的每个“成员”创建随机的生日(1-365天),然后进行比较,查看该组中是否有相同的生日。该程序将对给定的组大小进行10000次比较,并跟踪其中有多少试验产生了相同的生日,并返回10000次试验中有匹配的百分比 我遇到的问题是,这个程序只会返回100%,而每次连续运行都会加倍。因此,如果用户决定使用不同的组大小再次运行,那么答案会变成“200%”,然后
//This program will ask for the number of people in a group and then output
//percentage likelyhood that two birthdays occur on the same day.
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int bdays [365];
const int loop = 10000;
int identicalBday;
void setZero (int []);
int totalDoubles (int [], int);
int main()
{
int grpSize = 1;
cout << "This program will ask for the number of people in a group and then output \npercentage likelyhood that two birthdays occur on the same day.";
cout << "\nHow many in group (0 quits)? ";
cin >> grpSize;
while (grpSize != 0)
{
int identicalBday = 0;
setZero (bdays);
cout << "In a group of " << grpSize << " the chances that two birthdays are the same is " << totalDoubles (bdays, grpSize) << "%." << endl;
cout << "\nHow many in group (0 quits)? ";
cin >> grpSize;
}
cout << "Thanks for using this program.";
cin.get();
cin.get();
return 0;
}
//Sets all indicies to 0
void setZero (int bdays [])
{
for (int i = 0; i < 365; i++)
bdays [i] = 0;
}
//Will add one to the array index associated with the random rumber
//If that index is already equal to 1, then it breaks (at least one other identical birthday exists)
//When it does break, will add one to the indenticalBday, allowing for division at the end
int totalDoubles (int bdays [], int grpSize)
{
int tmpRand;
for (int k = 0; k <= loop; k++)
{
for (int i = 0; i <= grpSize; i++)
{
srand((unsigned)time(0));
tmpRand = rand() % 365;
if (bdays[tmpRand] == 1)
{
identicalBday++;
break;
}
else
bdays [tmpRand]++;
}
}
return (identicalBday/loop)*100;
}
//此程序将询问组中的人数,然后输出
//两个生日发生在同一天的可能性百分比。
#包括
#包括
#包括
使用名称空间std;
国际b天[365];
const int loop=10000;
国际统一日;
void setZero(int[]);
整数TotalDouble(整数[],整数);
int main()
{
int grpSize=1;
不能聚集;
while(grpSize!=0)
{
int identicalBday=0;
设置零(b天);
您的问题是行int identicalBday=0;
——您能猜出原因吗
由于您在开始时使用了int
,因此您正在声明一个仅存在于while
循环中的新变量。这使得全局identicalBday
未初始化,这意味着它永远不会重置,因此它在循环中每次都会增加。您的问题是行int identicalBday=0;
你能猜出原因吗
由于在开始时使用了int
,因此您正在声明一个新变量,该变量仅存在于while
循环中。这使得全局identicalBday
未初始化,这意味着它永远不会重置,因此它在循环中每次都会增加。此代码存在各种错误
- 正如Gabe所提到的,
int identicalBday=0
是局部变量,不会重置全局变量,这解释了运行之间100%的增长。我认为可以通过使用一个简单的编码样式规则来避免这个错误:在需要变量的位置/时间声明变量,这是最可能的局部变量,而不是全局变量。例如e、 identicalBday
和bdays
应该在totalDoubles()
中声明。这样做还将消除此函数的所有副作用,并保证在调用之间重置所有内容
- 通过在每个步骤中调用
srand()
,可以将种子重置为相同的值(时间变化不够快),并消除所有随机性。只调用一次
- 每次
grpSize
循环后,您都会忘记调用setZero(b天)
(identicalBday/loop)*100;
不正确地进行整数除法,并将结果四舍五入为0(如果srand
错误未修复,则为1)。使用浮点除法
在这里修复这些代码似乎可以得到正确的结果(例如,经典的23给出53%)此代码存在各种错误
- 正如Gabe所提到的,
int identicalBday=0
是局部变量,不会重置全局变量,这解释了运行之间100%的增长。我认为可以通过使用一个简单的编码样式规则来避免这个错误:在需要变量的位置/时间声明变量,这是最可能的局部变量,而不是全局变量。例如e、 identicalBday
和bdays
应该在totalDoubles()
中声明。这样做还将消除此函数的所有副作用,并保证在调用之间重置所有内容
- 通过在每个步骤中调用
srand()
,可以将种子重置为相同的值(时间变化不够快),并消除所有随机性。只调用一次
- 每次
grpSize
循环后,您都会忘记调用setZero(b天)
(identicalBday/loop)*100;
不正确地进行整数除法,并将结果四舍五入为0(如果srand
错误未修复,则为1)。使用浮点除法
修复这些问题似乎可以得到正确的结果(例如,经典23给出53%)感谢您花时间处理此问题。我今天下午发现了此错误以及整数除法错误并修复了所有问题!感谢您花时间处理此问题。我今天下午发现了此错误以及整数除法错误并修复了所有问题!我非常感谢您的反馈和花时间检查。李我向Gabe提到过,在最后一步中,identicalBday的全局声明和整数除法一起把事情搞砸了。现在一切都很好!我真的很感谢你的反馈和花时间检查。正如我向Gabe提到的,identicalBday的全局声明和整数除法一起把事情搞砸了在最后一步,一切都很好!