3669 - 十赌九输
俗话说:十赌九输。因为大多数赌局的背后都藏有阴谋。不过也不尽然,有些赌局背后藏有的是:“阳谋”。
有一种赌局是这样的:桌子上放六个匣子,编号是1至6。多位参与者(以下称玩家)可以把任意数量的钱押在某个编号的匣子上。所有玩家都下注后,庄家同时掷出3个骰子(骰子上的数字都是1至6)。输赢规则如下:
- 若某一个骰子上的数字与玩家所押注的匣子号相同,则玩家拿回自己的押注,庄家按他押注的数目赔付(即1比1的赔率)。
- 若有两个骰子上的数字与玩家所押注的匣子号相同,则玩家拿回自己的押注,庄家按他押注的数目的2倍赔付(即1比2的赔率)。
- 若三个骰子上的数字都与玩家所押注的匣子号相同,则玩家拿回自己的押注,庄家按他押注的数目的6倍赔付(即1比6的赔率)。
- 若玩家所押注匣子号与某个骰子示数乘积等于另外两个骰子示数的乘积,则玩家拿回自己的押注,庄家也不赔付(流局)。
- 若以上规则有同时满足者,玩家可以选择对自己最有利的规则。规则执行后,则庄家收获所有匣子上剩余的押注。
乍一看起来,好像规则对玩家有利,庄家吃亏。但经过大量实战,会发现局面很难说,于是怀疑是否庄家做了手脚,庄家则十分爽快地说:可以由玩家提供骰子,甚至也可以由玩家来投掷骰子。
你的任务是:通过编程模拟该过程。模拟50万次,假定只有1个玩家,他每次的押注都是1元钱,其押注的匣子号是随机的。再假定庄家有足够的资金用于赔付。最后计算出庄家的盈率(庄家盈利金额/押注总金额)。
Input
Output
程序运行输出庄家的盈率。
要求舍掉小数部分只保留到整数部分(注意不是四舍五入)。
50万次模拟中,假如盈利金额为10万,应该输出: 20%
Examples
Input
Output
Solution C++
#include <stdio.h> #include <time.h> #include <stdlib.h> int main() { srand(time(0)); //随机数发生器初始化,不初始化的话每次结果就都一样了 int z[3];//存庄家掷的三个骰子的点数 int player;//存玩家掷的骰子的点数 int profit = 0;//庄家的盈利 int rep;//庄家掷的三个骰子有几个与玩家的骰子相同 for (int i = 0; i < 500000; i++) { rep=0; player=1+rand()%6; for (int j = 0; j < 3; j++) { z[j] = 1+rand()%6; if (player == z[j]) rep++; } switch (rep) { case 1: profit -= 1; break; case 2: profit -= 2; break; case 3: profit -= 6; break; default: if (player * z[0] == z[1] * z[2] || player * z[1] == z[0] * z[2] || player * z[2] == z[0] * z[1]) continue; else profit++; break; } }//模拟50万次结束 printf("%d%%\n",int(profit/5000.0)); return 0; }