Парадокс Дня Рождения C ++ с использованием булевой функции

У меня есть задание, в котором мне нужно вычислить вероятность того, что два человека будут иметь один и тот же день рождения для данного размера комнаты (в моем случае 50) во многих испытаниях (5000). Я должен случайным образом назначить дни рождения числу людей в комнате. Разница в том, что мне нужно использовать булеву функцию, чтобы проверить, совпадают ли дни рождения. Я не могу понять, почему мои выходы отключены, но я верю, что это как-то связано с двумя моими циклами.

>

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

bool SameBirthday(int birthdays[], int numpeople);
const int MAX_PEOPLE = 50;
const double NUM_TRIALS = 5000.0;
const int DAYS_IN_YEAR = 365;

int main(void)
{
int numMatches = 0;
int people = 2;
int trial = 0;
int numpeople = 0;
int i = 0;
int birthdays[MAX_PEOPLE];
bool Match;
double Probability = 0;
srand(time(0));
for (people = 2; people <= MAX_PEOPLE; people++)
{
numMatches = 0;

for (trial = 0; trial < NUM_TRIALS; trial++)
{
for (i = 0; i < people; i++)
{
birthdays[i] = (rand() % 365 + 1);
numpeople = i;

}
if ((SameBirthday(birthdays, numpeople) == true))
{
numMatches++;
}
}
Probability = (numMatches / NUM_TRIALS);
cout << "For " << people << ", the probability of two birthdays is about " << Probability << endl;
}
}
bool SameBirthday(int birthdays[], int numpeople)
{

bool match = false;
int numberofmatches = 0;
//Use this function to attempt to search the giving array birthdays and   count up number of times
//at least two people have matching birthdays for any given 1 trial
for (int SpaceOne = 0; SpaceOne < numpeople; SpaceOne++)
{
for (int SpaceTwo = SpaceOne + 1; SpaceTwo < numpeople; SpaceTwo++)
{
if (birthdays[SpaceTwo] == birthdays[SpaceOne])
{
return true;
}
}
}
return false;
}

I know that the code has errors in certain spots that was because I started trying different things, but any help would be appreciated.
EDIT- My only issue now is that for my output I have a zero for the probability of 2 people in the room have a birthday, which is not right. It seems like my outputs are like a person off, the probability of 2 people is shown as the probability for three people and so on.
EDIT(8-31-2015): I also forgot to mention that my Professor stated that my SameBirthday function needed the parameters: birthday[], and numpeople so I cannot use MAX_PEOPLE as a parameter. My professor also suggested using a triple nested for loop within the main body of the function. I believe what is making my output off by one for each person relates to the triple nested for loop, but I am unsure what would cause the issue.

1

Решение

Просто сделайте это так:

bool SameBirthday(int birthdays[], int numPeople)
{
for(int x=0; x<numPeople; x++){
for(int y=0; y<numPeople; y++){
if(birthdays[x] == birthdays[y])
return true;
}
}
return false;
}

Ваша логика в вашем вложенном цикле неверна ..

for (SpaceOne = 0; SpaceOne < numpeople - 1; SpaceOne++)
for (SpaceTwo = SpaceOne + 1; SpaceTwo < numpeople; SpaceTwo++)

Ваш внутренний цикл пропускает n количество проверок где n равно SpaceOne.

Кстати, это не Си-программирование. Вы можете объявить переменную в цикле for.

2

Другие решения

Я вижу две проблемы с реальной функциональностью. Во-первых, SameBirthday должен вернуть значение (false), когда нет совпадения дня рождения. Вы можете сделать это в конце функции, после того, как все циклы сделаны.

Во-вторых, вам нужно увеличить numMatches, когда вы найдете совпадение.

0

Для выяснения вопросов из других частей вашего кодирования. Я думаю, это то, чего хочет твоя школа.

int main(){
//All your variables

for(int x=0; x<NUM_TRIALS; x++){
for(int y=0; y< MAX_PEOPLE; y++){
birthdays[y] = (rand() % 365 + 1);
}

if(SameBirthday(birthdays, MAX_PEOPLE) == true)
numMatches ++;
}
Probability = ((double)numMatches / NUM_TRIALS);
cout << "For " << people << ", the probability of two birthdays is about "<< Probability << endl;
}

NUM_TRIALS создать 5000 наборов данных. Следовательно, вы генерируете день рождения для 50 студентов 5000 раз. Для каждого испытания в классе 50 вы проверяете, есть ли 2 человека с одинаковым днем ​​рождения. Если там есть, numMatches + 1,

После 5000 испытаний вы получите вероятность.

0

Другая ваша проблема в том, что число людей всегда будет равно числу людей минус 1. На самом деле эта переменная вообще не нужна. Ваша переменная «people» — это правильное количество людей.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector