C++ 在C+中的特定组大小中检查相同的生日+;

C++ 在C+中的特定组大小中检查相同的生日+;,c++,C++,我对这个网站是全新的。一位朋友告诉我这件事,以及这件事对他有多大的帮助,现在就开始吧 我正试图创建一个程序,将在一定规模的群体阅读。此时,它将为组中的每个“成员”创建随机的生日(1-365天),然后进行比较,查看该组中是否有相同的生日。该程序将对给定的组大小进行10000次比较,并跟踪其中有多少试验产生了相同的生日,并返回10000次试验中有匹配的百分比 我遇到的问题是,这个程序只会返回100%,而每次连续运行都会加倍。因此,如果用户决定使用不同的组大小再次运行,那么答案会变成“200%”,然后

我对这个网站是全新的。一位朋友告诉我这件事,以及这件事对他有多大的帮助,现在就开始吧

我正试图创建一个程序,将在一定规模的群体阅读。此时,它将为组中的每个“成员”创建随机的生日(1-365天),然后进行比较,查看该组中是否有相同的生日。该程序将对给定的组大小进行10000次比较,并跟踪其中有多少试验产生了相同的生日,并返回10000次试验中有匹配的百分比

我遇到的问题是,这个程序只会返回100%,而每次连续运行都会加倍。因此,如果用户决定使用不同的组大小再次运行,那么答案会变成“200%”,然后是“300%”,依此类推

在此方面的任何帮助都将不胜感激

//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的全局声明和整数除法一起把事情搞砸了在最后一步,一切都很好!