ブルーブリッジカップ_第3回_決勝戦_C言語高職グループ_4


十博九敗と言われる.多くの賭博の背後に陰謀が隠されているからだ.しかし、必ずしもそうではありません.一部の賭博の背後には「陽謀」が隠されています.
テーブルの上に6つの箱を置いて、番号は1から6です.複数の参加者(以下、プレイヤー)は、任意の数のお金をある番号の箱に押さえることができる.すべてのプレイヤーが賭けた後、荘家は同時に3つのサイコロを投げた(サイコロの数字はすべて1~6).勝負のルールは以下の通りです.
    1. あるサイコロの数字がプレイヤーが押した箱番号と同じであれば、プレイヤーは自分の賭けを取り戻し、荘家は彼が押した数で弁償する(すなわち1対1の賠償率).
    2. 2つのサイコロの数字がプレイヤーが押した箱番号と同じであれば、プレイヤーは自分の賭けを取り戻し、荘家は彼が押した数の2倍の賠償(すなわち1対2の賠償率)を払う.
    3. 3つのサイコロの数字がプレイヤーが押した箱番号と同じであれば、プレイヤーは自分の賭けを取り戻し、荘家は彼が押した数の6倍の賠償(すなわち1対6の賠償率)を払う.
    4. プレイヤーが押した箱番号とあるサイコロの数の積が他の2つのサイコロの数の積に等しい場合、プレイヤーは自分の賭けを取り戻し、荘家も弁償しない(流局).
    5. 以上のルールに同時に満足する者がいれば、プレイヤーは自分にとって最も有利なルールを選択することができる.ルールが実行されると、荘家はすべての箱の残りの賭けを収穫した.
一見、ルールがプレイヤーに有利なように見え、荘家は損をしている.しかし、大量の実戦を経て、局面が難しいことに気づき、荘家が手足を作ったのではないかと疑い、荘家は「プレイヤーがサイコロを提供することができ、プレイヤーがサイコロを投げることもできる」と率直に言った.
あなたの任務は、プログラミングを通じてこのプロセスをシミュレートすることです.シミュレーションは50万回で、1人のプレイヤーしかいないと仮定すると、彼の毎回の賭けは1元で、その賭けの箱番号はランダムです.荘家は賠償に十分な資金を持っていると仮定した.最後に荘家の収益率(荘家の利益金額/注ぎ込み総額)を算出した.
【入力・出力フォーマット要件】
プログラムは入力がなく、プログラムは出力荘家の収益率を実行し、四捨五入して小数後3位に保留する.
#include 
#include 
#include 
#include 

using namespace std;

int main()
{
    int z1,z2,z3,w1;
    int maxp,times,win;

    srand((unsigned)time(NULL));
    times=0;
    win=0;
    while(times<500000)
    {
        maxp=-1;
        z1=rand()%6;
        z2=rand()%6;
        z3=rand()%6;
        w1=rand()%6;

        if(z1==w1||z2==w1||z3==w1)  maxp=maxp>1?maxp:1;
        if((z1==w1&&z2==w1)||
           (z1==w1&&z3==w1)||
           (z2==w1&&z2==w1))        maxp=maxp>2?maxp:2;
        if(z1==w1&&z2==w1&&z3==w1)  maxp=maxp>6?maxp:6;
        if((w1*z1==z2*z3)||
           (w1*z2==z1*z3)||
           (w1*z3==z1*z2))          maxp=maxp>0?maxp:0;
        win+=maxp;
        times++;
    }
    printf("%.3lf
",(double)(times-win)/times); return 0; }