中奖问题---蒙特卡洛算法实现

题目如图:
中奖问题---蒙特卡洛算法实现_第1张图片
这其实是一个基础的概率问题
蒙特卡洛算法实现代码如下:

package Test;

public class WinningPrize {

    private double chance;
    private int playTime;
    private int N;

    public WinningPrize(double chance, int playTime, int N) {

        if (chance < 0.0 || chance > 1.0)
            throw new IllegalArgumentException("chance must be between 0 and 1!");

        if (playTime <= 0 || N <= 0)
            throw new IllegalArgumentException("playTime or N must be larger than 0!");

        this.chance = chance;
        this.playTime = playTime;
        this.N = N;
    }

    public void run() {

        int wins = 0;
        for (int i = 0; i < N; i++)
            if (play())
                wins++;

        System.out.println("winning rate: " + (double) wins / N);
    }

    private boolean play() {
        for (int i = 0; i < playTime; i++)
            if (Math.random() < chance)
                return true;
        return false;
    }

    public static void main(String[] args) {

        double chance = 0.2;
        int playTime = 5;
        int N = 1000000;

        WinningPrize exp = new WinningPrize(chance, playTime, N);
        exp.run();
    }
}

运行结果:

winning rate: 0.672318

这是来修改一些参数:
如果增大N,中奖概率变化不大,一直在0.67左右徘徊
中奖问题---蒙特卡洛算法实现_第2张图片
如果增大playTime,也就是打开宝箱的数量,发现中奖的概率会上升.
中奖问题---蒙特卡洛算法实现_第3张图片
事实是只要宝箱的中奖率不是100%,理论上来说抽多少次都不能保证100%中奖.

其实只要利用反向推导法就能很容易求出该问题的解:
1-(0.8)^5=0.67232
所以通过蒙特卡洛算法模拟出来的值也一直在这个精确值附近徘徊.
由于不中奖的概率小于1,当我们增加抽奖的次数时,最终中奖的概率是会增加的
1/0.2=5,这里的5的意思是抽奖的期望值,并不是一定会获奖.

你可能感兴趣的:(算法,计算机与概率统计,蒙特卡洛算法,Java学习之路)