数据结构与算法应用(十八):古代赌局——蓝桥杯2012年Java决赛

16 篇文章 0 订阅
10 篇文章 0 订阅
俗话说:十赌九输。因为大多数赌局的背后都藏有阴谋。不过也不尽然,有些赌局背后藏有的是:“阳谋”。

有一种赌局是这样的:桌子上放六个匣子,编号是1至6。多位参与者(以下称玩家)可以把任意数量的钱押在某个编号的匣子上。所有玩家都下注后,庄家同时掷出3个骰子(骰子上的数字都是1至6)。输赢规则如下:

1. 若某一个骰子上的数字与玩家所押注的匣子号相同,则玩家拿回自己的押注,庄家按他押注的数目赔付(即1比1的赔率)。

2. 若有两个骰子上的数字与玩家所押注的匣子号相同,则玩家拿回自己的押注,庄家按他押注的数目的2倍赔付(即1比2的赔率)。

3. 若三个骰子上的数字都与玩家所押注的匣子号相同,则玩家拿回自己的押注,庄家按他押注的数目的6倍赔付(即1比6的赔率)。

4. 若玩家所押注匣子号与某个骰子示数乘积等于另外两个骰子示数的乘积,则玩家拿回自己的押注,庄家也不赔付(流局)。

5. 若以上规则有同时满足者,玩家可以选择对自己最有利的规则。规则执行后,则庄家收获所有匣子上剩余的押注。

乍一看起来,好像规则对玩家有利,庄家吃亏。但经过大量实战,会发现局面很难说,于是怀疑是否庄家做了手脚,庄家则十分爽快地说:可以由玩家提供骰子,甚至也可以由玩家来投掷骰子。

你的任务是:通过编程模拟该过程。模拟50万次,假定只有1个玩家,他每次的押注都是1元钱,其押注的匣子号是随机的。再假定庄家有足够的资金用于赔付。最后计算出庄家的盈率(庄家盈利金额/押注总金额)。

【输入、输出格式要求】

程序无输入,程序运行输出庄家的盈率,四舍五入保留到小数后3位。
public class Main {
	void init() {
	}

	public static void main(String[] args) {
		double count = 0, lose = 0;
		Random random = new Random();
		for (int n = 0; n < 500000; n++) {
			int check = Math.abs(random.nextInt() % 6) + 1;
			int i = Math.abs(random.nextInt() % 6) + 1;
			int j = Math.abs(random.nextInt() % 6) + 1;
			int k = Math.abs(random.nextInt() % 6) + 1;
			count++;

			if (i == check && j == check && k == check) {
				lose = lose + 6 + 1;

			} else if ((i == check && j == check) || (i == check && k == check)
					|| (k == check && j == check)) {
				lose = lose + 2 + 1;

			} else if (i == check || j == check || k == check) {
				lose = lose + 1 + 1;

			} else if ((check * i == j * k) || (check * j == i * k)
					|| (check * k == j * i)) {
				lose = lose + 1;

			}
		}

		double win = 1 - lose / count;
		// System.out.println(new
		// BigDecimal(win).setScale(3,BigDecimal.ROUND_HALF_UP));
		System.out.format("%.3f", win);
	}

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值