随机算法(古代赌局)

古代赌局:

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

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

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

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

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

代码如下:

package sf_6;
public class Main {
    /**
     * @param args
     */
    public static  int f(){
        /*
         * Math.random() 产生的是[0,1)的数。
         */
        /*
         * 庄家掷出的三个骰子的结果:
         * Math.random()*6 产生的是0~5的数,所以应当进行+1操作。
         */
        int a=(int)(Math.random()*6)+1;//产生0~6的数。
        int b=(int)(Math.random()*6)+1;//产生0~6的数。
        int c=(int)(Math.random()*6)+1;//产生0~6的数。

        //模拟用户押了哪一个箱子
        int w=(int)(Math.random()*6)+1;//产生0~6的数。

        int n=0;
        if(a==w) n++;
        if(b==w) n++;
        if(c==w) n++;

        if(n==3) return -10;
        if(n==2) return -2;
        if(n==1) return -1;

        return 1;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int N=500*1000;
        double sum=0;for(int i=0;i<N;i++){
            sum+=f();
        }
        /*
         * N(500000元)为押注总金额;
         * sum为庄家的赢利金额。
         */
        System.out.print(sum/N);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值