【发布时间】:2014-08-24 23:10:24
【问题描述】:
下面的问题是我在wiki page 上遇到的一个问题。
编写一个程序来发现这个难题的答案:“假设是男人 妇女获得同等报酬(来自相同的均匀分配)。如果 女人随机约会,嫁给第一个薪水高的男人,什么 一小部分人会结婚?”
我的算法:
用随机工资值填充两个数组(女性和男性)。
将女性与随机男性配对并比较薪水。如果是女性 工资低于男性,增加婚姻计数器。设置两个女性 并且男性
isMarried值为true。继续约会过程,直到未婚男性的最高工资达到 低于未婚女性的最低工资。
这是我的实现:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
srand(time(NULL));
int min = 1;
int max = 1000000;
Male male[100];
Female female[100];
double count = 0;
bool done = false;
//Fill array of Females and Males with random salaries ranging from 1 to 10
for(int i=0; i<100; i++){
int output = min + (rand() % (int)(max - min + 1));
male[i].salary = output;
}
for(int i=0; i<100; i++){
int output = min + (rand() % (int)(max - min + 1));
female[i].salary = output;
}
//Start dating
//Keep dating until the maximum salary of males is lower than minimum salary of females
do{
random_shuffle(begin(male), end(male)); //Shuffle array of males
random_shuffle(begin(female), end(female)); //Shuffle array of females
for(int i=0; i<100; i++){ //Compare a female and male from both arrays
if(female[i].salary < male[i].salary)
if(!female[i].isMarried && !male[i].isMarried){
count++;
female[i].isMarried = true;
male[i].isMarried = true;
cout << "Female salary: " << female[i].salary << endl;
cout << "Male salary: " << male[i].salary << endl;
}
}
int maxMen = 0;
for(int i=0; i<100; i++){
if(male[i].salary > maxMen && !male[i].isMarried)
maxMen = male[i].salary;
}
int minWomen = 1000000;
for(int i=0; i<100; i++){
if(female[i].salary < minWomen && !female[i].isMarried)
minWomen = female[i].salary;
}
if(maxMen <= minWomen)
done = true;
}while(!done);
cout << "Percentage: " << count/100;
cout << endl;
int unmarried = 0;
cout << "Number of unmarried females: ";
for(int i=0; i<100; i++)
if(!female[i].isMarried)
unmarried++;
cout << unmarried << endl;
unmarried = 0;
cout << "Number of unmarried males: ";
for(int i=0; i<100; i++)
if(!male[i].isMarried)
unmarried++;
cout << unmarried << endl;
cout << endl;
return a.exec();
}
我在 Programmers.SE 上问过这个问题,显然是I should be getting 68%。 我得到的百分比值范围从 35% 到 40%。我做错了什么?
【问题讨论】:
-
首先,消除工资冲突——使用从 1 到 100 万的范围来表示每种性别的 100。这只是为了消除可能的混淆变量。其次,你有女人和已婚男人约会,这看起来很可疑(你确实停止了婚姻)。第三,如果 maxMen==minWomen,你会永远循环……
-
好的,将最高工资提高到 100 万。以及约会结束的条件(maxMen
-
另外,看起来
isMarried字段没有初始化,虽然这很难说,因为你没有向我们展示类定义。 (和Male female[100];...?) -
@T.C.那是一个错字!两个类都有两个成员。
isMarried和salary。isMarried被初始化为 false。 -
我是唯一一个发现问题陈述令人不安的人吗?
标签: c++ probability