10个房间里放着随机数量的金币。每个房间只能进入一次,并只能在一个房间中拿金币。 一个人采取如下策略:前四个房间只看不拿。随后的房间只要看到比前四个房间都多的金币数, 就拿。否则就拿最后一个房间的金币。编程计算这种策略拿到最多金币的概率。
#include <ctime>
#include <random>
#include<iostream>
using namespace std;
const int rooms = 10;
class MaxMoney
{
public:
MaxMoney(int num=4):number(num){ e.seed(time(nullptr));}
void init();
bool isSelectMax();
void test();
private:
int number;
int money[rooms];
int maxMomey;
default_random_engine e;
};
void MaxMoney::init()
{
maxMomey = 0;
for (int i=0;i<rooms;i++)
{
money[i] = e()%1000000;
if (money[i]>maxMomey)
{
maxMomey = money[i];
}
}
}
bool MaxMoney::isSelectMax()
{
int tempMax = 0;
int finalMax = 0;
for (int i=0;i<number;++i)
{
tempMax = tempMax<money[i]?money[i]:tempMax;
}
for (int i=number;i<rooms;++i)
{
if (money[i]>tempMax)
{
finalMax = money[i];
break;
}
}
if (finalMax==0)
{
return maxMomey==money[rooms-1];
}
else
{
return maxMomey==finalMax;
}
}
void MaxMoney::test()
{
double count = 0;
double maxCount = 0;
while (true)
{
init();
if (isSelectMax())
{
maxCount++;
}
count++;
cout<<maxCount/count<<endl;
}
}
int main()
{
MaxMoney m;
m.test();
return 0;
}