Что не так с моим кодом для этого вопроса?
Предположим, что люди входят в пустую комнату до тех пор, пока у пары людей не совпадет день рождения. Напишите программу BirthdayCoincidence для моделирования одного эксперимента. Результатом этой программы является количество людей, которые были добавлены до тех пор, пока у пары не совпадали дни рождения.
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main(){
srand(time(0));
int year = 365;
int people = 0;
int daycnt = 0;
bool found[year];
while(daycnt<year){
people++;
int birthday = (int)(rand() % year+1);
cout<<birthday<<endl;
if (found[birthday] == true){
daycnt++;
cout<<people<<endl;
break;}
found[birthday] = true;
}
}
Другой парадокс заключается в том, что в году не 365 дней. У четырех миллионов человек день рождения 29 февраля.
Вы генерируете числа от 1 до 365 (включительно), а 365 является недопустимым индексом для вашего массива. Потерять + 1.
bool found[year]; является недопустимым C++, так как const отсутствует для year.
@HansPassant Это было бы сложно принять во внимание. Может быть, отбросить 366 три раза вместо четырех.
@ Ганс, ты имеешь в виду двадцать миллионов человек? (*4000000 365,25) дает всего 1,4 миллиарда.
Добро пожаловать в Stack Overflow! Пожалуйста, редактировать свой вопрос, чтобы показать нам, какую отладку вы выполнили. Я ожидаю, что вы запустили свой минимальный воспроизводимый пример в Valgrind или аналогичном средстве проверки и исследовали его с помощью отладчика, такого как, например, GDB. Убедитесь, что вы также включили полный набор предупреждений компилятора. Что инструменты сказали вам, и какую информацию они упускают? И прочтите Как отлаживать небольшие программы Эрика Липперта.
@Bob__, это достаточно просто: сгенерируйте случайное число в [0,1460], а затем разделите на 4. Результат 365 будет равен ¼ от других значений (при условии, что вы используете std::uniform_distribution для генерации чисел).





Вы не инициализировали логический массив found. Доступ к неинициализированным переменным приведет к неопределенному поведению.
Вы должны сделать это:
bool found[year] = {false};
Это инициализирует все элементы массива как false.
массивы переменной длины не являются частью стандарта. Хотя GCC поддерживает их как расширение, не каждый компилятор поддерживает их. Таким образом, вы должны иметь константу времени компиляции в качестве размера массива.
constexpr int year = 365;
Еще одним источником неопределенного поведения является следующая проверка:
if (found[birthday] == true)
Поскольку birthday находится в диапазоне от 1 до 365, found[365] вызовет доступ за пределами допустимого диапазона, поскольку допустимый диапазон индекса — от 0 до 364. Таким образом, вы можете использовать эту проверку вместо:
if (found[birthday-1] == true)
Технически вам нужно только bool found[year] = {}; для инициализации всех элементов по умолчанию. Предоставление значения false влияет только на первый элемент. Если бы вы написали bool found[year] = {true};, то found[0] == true, а остальное было бы false.
да. Я не хотел объяснять новичку инициализацию значений, инициализацию по умолчанию и т.д.
Я сделал это, но теперь в моем выводе есть ошибка. он говорит, что "объект переменного размера не может быть инициализирован" в течение года
@FrancieAkins: у меня это работает. См. эту ссылку: godbolt.org/z/bY7_Mw
@PW Эта конструкция bool found[year]; называется массив переменной длины или VLA. VLA являются нет допустимыми C++, поскольку в C++ размер массива должен быть постоянным. Некоторые компиляторы разрешают их в качестве расширения, но многие компиляторы не разрешают их вообще. Поэтому я боюсь, что сложно спросить о них на форуме C++, поскольку они не являются законными C++.
@PW Способ написания этого кода на С++ - использовать вектор. #include <vector> затем объявите вектор как std::vector<bool> found(year, false); никаких других изменений, необходимых для вашего кода.
@john: я согласен. Не знаю, какие ограничения есть у ОП. Так что вектор я не предлагал.
@FrancieAkins: Похоже, ваш компилятор не поддерживает VLA. Итак, вы можете: constexpr int year = 365; Обновить ответ.
Читать Как отлаживать небольшие программы. Скомпилируйте свой код со всеми предупреждениями и отладочной информацией, поэтому
g++ -Wall -Wextra -gпри использовании ССАГПЗ