Когда я ввожу число, я получаю 1 независимо от того, какое число я использую. Как я могу это исправить?
//"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." << endl << endl;
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
int FindThePerctange(int [], int);
void RandArray(int, int []);
void Counter(int []);
int main (){
int GroupNumber;
int DayOfBirth [365] = {};
char Percant;
Percant = '%';
cout << "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." << endl << endl;
cout << "How many in group (0 quits)? ";
cin >> GroupNumber;
if (GroupNumber == 0){
cout << "\nThanks for using this program.";
srand(time(0));
}
else{
cout << "In a group of " << GroupNumber << " the chances for two birthdays the same is " << FindThePerctange(DayOfBirth, GroupNumber) << Percant << "." << endl << endl;
cout << "How many in group (0 quits)? ";
cin >> GroupNumber;
cout << "In a group of " << GroupNumber << " the chances for two birthdays the same is " << FindThePerctange(DayOfBirth, GroupNumber) << Percant << "." << endl << endl;
cout << "How many in group (0 quits)? " << endl;
cin >> GroupNumber;
cout << "Thanks for using this program.";
}
cin.get();
cin.get();
return 0;
}
int FindThePerctange(int DayOfBirth [], int GroupNumber){
double Overlap = 0, Percentage;
for (int d =0; d<=10000; d++){
(GroupNumber, DayOfBirth);
while (d <= 365){
int j;
j = 0;
j++;
if(DayOfBirth[j] >= 2){
Overlap = Overlap + 1;
j=365;
}
return j;
}
Percentage = (Overlap/10000)*100;
return Percentage;
}
}
void RandArray(int GroupNumber, int DayOfBirth[]){
int Day, d;
while (d < GroupNumber){
Day = rand()%365;
DayOfBirth[Day] +=1;
d++;
}
}
void Counter(int DayOfBirth[]){
for (int d = 0; d<=365; d++){
DayOfBirth[d] = 0;
}
}
2 ответа
В вашем методе FindThePerctange у вас есть проблема. Внутри цикла while вы объявляете переменную j, устанавливаете ее в 0, увеличиваете до 1, а затем сразу возвращаете. Это означает, что вы получите 1 каждый раз.
Я думаю, что вы пытаетесь сделать это увеличивать j каждый раз в цикле while. Если да, поместите объявление j вне цикла while, вот так:
int FindThePerctange(int DayOfBirth [], int GroupNumber){
double Overlap = 0, Percentage;
int j;
for (int d =0; d<=10000; d++){
//(GroupNumber, DayOfBirth);
j = 0;
while (d <= 365){
j++;
if(DayOfBirth[j] >= 2){
Overlap++;
j=365;
}
}
Percentage = (Overlap/10000)*100;
return Percentage;
}
}
Это все еще не делает ваш код работоспособным, но, по крайней мере, не вернет 1. Я не собираюсь переписывать всю вашу программу для вас (кто-то другой, вероятно, будет), но она не делает то, что вы ожидаете делать.
Изменить: Я хочу помочь вам больше, но ваш код внутренне несовершенен. Ваша самая большая проблема, вероятно, в том, что вы не присваиваете значение массиву DayOfBirth. Я бы предложил вернуться и перекодировать это. Проблема, которую вы задаете, тривиальна. Учтите следующее:
Предположим, что день рождения каждого человека является случайным числом от 1 до 365. Тогда день рождения первого человека назначается A. Второй человек имеет шанс 1 на 365 попасть в тот же день. Таким образом, для размера группы 2 вероятность составляет 1 / 365 или около 0,27 . Если предположить, что размер группы равен 3, а 2-й человек не попал первым, у третьего есть шанс 2 / 365, или около 0,54%. Предполагая, что генератор случайных чисел является абсолютно случайным, ваш шанс того, что две даты рождения столкнутся, будет (groupsize - 1) / 365.
Таким образом, ваш код должен будет только принять GroupSize. Сокращено до:
float FindThePerctange(int GroupNumber){
return (GroupNumber - 1) / 365 * 100;
}
Вы тоже не звоните RandArray()
ни где ни DayofBirth[]
получить любую ценность.