此问题的代码有什么问题?
假设人们进入一个空房间,直到一对人分享生日。编写程序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;
}
}
答案 0 :(得分:1)
您尚未初始化布尔数组found
。访问未初始化的变量将导致未定义的行为。
您应该这样做:
bool found[year] = {false};
这会将数组的所有成员初始化为false
。
可变长度数组不是标准的一部分。尽管GCC支持它们作为扩展,但并非每个编译器都支持。因此,您应该将编译时常数作为数组的大小。
constexpr int year = 365;
未定义行为的另一个来源是以下检查:
if (found[birthday] == true)
由于birthday
的范围从1
到365
,因此found[365]
将导致越界访问,因为有效的索引范围是从0
到{{ 1}}。因此,您可以改用此检查:
364