试给出下面赌博中的蒙特卡洛模拟
在一次旅游途中,小王看到有人用20枚签(其中10枚标有5分分值,10枚标有10分分值)设赌。让游客从中抽出10枚,以10枚签的分值总和为奖罚金额,见表1
表1
分值   50,100         55,95     60,65,85,90        70,75,80
奖罚金额  奖100元          奖10元     不奖不罚         罚1元
你看,有奖有罚,在11个分值中有4个分值可以获奖,且最高奖额为100元;只有3个分值要受罚,而罚额仅为1元,很有吸引力吧?怪不得有些游客摩拳擦掌,跃跃欲试。那么这些奖是不是这么好拿呢?
试分析此游戏中,谁是真正的赢家?

解决方案 »

  1.   

    我天真了意思是
    50 和 100 奖100元
    55 和 95  奖10元
    60 65 90 85 不奖不罚
    70 75 80 罚1元以下是代码 每局大约输8角
    import java.util.LinkedList;
    import java.util.Random;public class Test {
    public static int play() {
    Drawer drawer = new Drawer();
    int result = drawer.draw();
    switch (result) {
    case 50:
    case 100:
    return 100;
    case 55:
    case 95: {
    return 10;
    }
    case 60:
    case 65:
    case 85:
    case 90:
    return 0;
    case 70:
    case 75:
    case 80:
    return -1;
    default:
    System.out.println("Error Happened!");
    return 0;
    }
    } public static void main(String[] args) {
    final int count = 10000;
    int sum = 0;
    for (int i = 0; i < count; i++) {
    sum += play();
    }
    System.out.println("Total Win : " + sum);
    System.out.println("Win Per Game : " + (double)sum / (double)count);
    }
    }class Drawer {
    LinkedList<Integer> lots = null; public Drawer() {
    lots = new LinkedList<Integer>();
    for (int i = 0; i < 10; i++) {
    lots.add(5);
    lots.add(10);
    }
    } public int draw() {
    Random rand = new Random();
    int sum = 0;
    for (int i = 0; i < 10; i++) {
    int index = rand.nextInt(lots.size());
    int lot = lots.remove(index);
    System.out.print(lot + " ");
    sum += lot;
    }
    System.out.println(" : " + sum);
    return sum;
    }
    }
      

  2.   

    我穷举了一下,大概会亏损-0.265625
    public class Lottery 
    {
    public static double getTotalNum()
    {
    return Math.pow(2, 10);
    }

    public static int[] getNums()
    {
    int[] returnNum = new int[11];
    int[] i = new int[10];
    for (i[0] = 5; i[0] <= 10; i[0] += 5)
    {
    for (i[1] = 5; i[1] <= 10; i[1] += 5)
    {
    for (i[2] = 5; i[2] <= 10; i[2] += 5)
    {
    for (i[3] = 5; i[3] <= 10; i[3] += 5)
    {
    for (i[4] = 5; i[4] <= 10; i[4] += 5)
    {
    for (i[5] = 5; i[5] <= 10; i[5] += 5)
    {
    for (i[6] = 5; i[6] <= 10; i[6] += 5)
    {
    for (i[7] = 5; i[7] <= 10; i[7] += 5)
    {
    for (i[8] = 5; i[8] <= 10; i[8] += 5)
    {
    for (i[9] = 5; i[9] <= 10; i[9] += 5)
    {
    int total = 0;
    for (int j = 0; j < 10; j++)
    {
    total += i[j];
    }
    switch (total)
    {
    case 50: returnNum[0]++; break;
    case 55: returnNum[1]++; break;
    case 60: returnNum[2]++; break;
    case 65: returnNum[3]++; break;
    case 70: returnNum[4]++; break;
    case 75: returnNum[5]++; break;
    case 80: returnNum[6]++; break;
    case 85: returnNum[7]++; break;
    case 90: returnNum[8]++; break;
    case 95: returnNum[9]++; break;
    case 100: returnNum[10]++; break;
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    return returnNum;
    }

    public static void main(String[] args)
    {
    double totalNum = getTotalNum();
    int[] tmp = getNums();
    int num50 = tmp[0];
    int num55 = tmp[1];
    int num60 = tmp[2];
    int num65 = tmp[3];
    int num70 = tmp[4];
    int num75 = tmp[5];
    int num80 = tmp[6];
    int num85 = tmp[7];
    int num90 = tmp[8];
    int num95 = tmp[9];
    int num100 = tmp[10];

    double money = (100 * (num50 + num100) + 10 * (num55 + num95) - 1 * (num70 + num75 + num80)) / totalNum;
    System.out.println(money);
    }
    }
      

  3.   

    自己统计一下美中情况出现的可能,算下概率就知道了
    import java.util.*;class CombineTest {
        public static void main(String[] args) {
            List<Integer> list = Arrays.asList(new Integer[]{5,5,5,5,5,5,5,5,5,5,10,10,10,10,10,10,10,10,10,10});
            Map<Integer, Integer> map = new HashMap<Integer, Integer>();
            combine(list, 10, new ArrayList<Integer>(), map);
            double total = 0;
            for (Integer i : map.values()) {
                total += i;
            }
            System.out.printf("total=%.3f\n", total);
            List<Map.Entry<Integer, Integer>> result = new ArrayList<Map.Entry<Integer, Integer>>(map.entrySet());
            Collections.sort(result, new Comparator<Map.Entry<Integer, Integer>>() {
                public int compare(Map.Entry<Integer, Integer> e1, Map.Entry<Integer, Integer> e2) {
                    if (e1.getValue().compareTo(e2.getValue()) == 0) {
                        return e1.getKey() - e2.getKey();
                    }
                    return e1.getValue() - e2.getValue();
                }
            });
            
            for (Map.Entry<Integer, Integer> e : result) {
                System.out.printf("%d:%d, percent=%.7f\n", e.getKey(), e.getValue(), e.getValue()/total);
            }
            
        }    public static void combine(List<Integer> list, int n, List<Integer> buf, Map<Integer, Integer> map) {
            if (list.size() < n) {
                return;
            }        if (list.size() == n) {
                buf.addAll(list);
                int sum = 0;
                for (Integer i : buf) {
                   sum += i;
                }
                Integer v = map.get(sum);
                if (v == null) {
                    v = 0;
                }
                map.put(sum, v+1);
                return;
            }        if (n == 1) {
                int sum = 0;
                for (Integer i : buf) {
                    sum += i;
                }
                for (Integer i : list) {
                    sum += i;
                    Integer v = map.get(sum);
                    if (v == null) {
                        v = 0;
                    }
                    map.put(sum, v+1);
                    sum -= i;
                }
                return;
            }        for (int i=0; i<list.size(); i++) {
                List<Integer> tmp = new ArrayList<Integer>(buf);
                tmp.add(list.get(i));
                combine(list.subList(i+1, list.size()), n-1, tmp, map);
            }    }
    }
      

  4.   

    追加了概率计算public static void main(String[] args) {
            List<Integer> list = Arrays.asList(new Integer[]{5,5,5,5,5,5,5,5,5,5,10,10,10,10,10,10,10,10,10,10});
            Map<Integer, Integer> map = new HashMap<Integer, Integer>();
            combine(list, 10, new ArrayList<Integer>(), map);
            double total = 0;
            for (Integer i : map.values()) {
                total += i;
            }
            System.out.printf("total=%.3f\n", total);
            List<Map.Entry<Integer, Integer>> result = new ArrayList<Map.Entry<Integer, Integer>>(map.entrySet());
            Collections.sort(result, new Comparator<Map.Entry<Integer, Integer>>() {
                public int compare(Map.Entry<Integer, Integer> e1, Map.Entry<Integer, Integer> e2) {
                    if (e1.getValue().compareTo(e2.getValue()) == 0) {
                        return e1.getKey() - e2.getKey();
                    }
                    return e1.getValue() - e2.getValue();
                }
            });
            
            int count = 0;
            double money = 1.0, win=money;
            for (Map.Entry<Integer, Integer> e : result) {
                System.out.printf("%d:%d, percent=%.7f\n", e.getKey(), e.getValue(), e.getValue()/total);
                if (count < 2) {
                    win += 100 * e.getValue()/total;
                } else if (count < 4) {
                    win += 10 * e.getValue()/total;
                } else if (count >= result.size()-3) {
                    win -= e.getValue()/total;
                }
                count++;
            }
            System.out.printf("win=%.7f\n", (win-money)/money);
            
        }    public static void combine(List<Integer> list, int n, List<Integer> buf, Map<Integer, Integer> map) {
            if (list.size() < n) {
                return;
            }        if (list.size() == n) {
                buf.addAll(list);
                int sum = 0;
                for (Integer i : buf) {
                   sum += i;
                }
                Integer v = map.get(sum);
                if (v == null) {
                    v = 0;
                }
                map.put(sum, v+1);
                return;
            }        if (n == 1) {
                int sum = 0;
                for (Integer i : buf) {
                    sum += i;
                }
                for (Integer i : list) {
                    sum += i;
                    Integer v = map.get(sum);
                    if (v == null) {
                        v = 0;
                    }
                    map.put(sum, v+1);
                    sum -= i;
                }
                return;
            }        for (int i=0; i<list.size(); i++) {
                List<Integer> tmp = new ArrayList<Integer>(buf);
                tmp.add(list.get(i));
                combine(list.subList(i+1, list.size()), n-1, tmp, map);
            }    }
    }打印结果
    total=184756.000
    50:1, percent=0.0000054
    100:1, percent=0.0000054
    55:100, percent=0.0005413
    95:100, percent=0.0005413
    60:2025, percent=0.0109604
    90:2025, percent=0.0109604
    65:14400, percent=0.0779406
    85:14400, percent=0.0779406
    70:44100, percent=0.2386932
    80:44100, percent=0.2386932
    75:63504, percent=0.3437182
    win=-0.8091970
    也就是说,赢钱的概率是-0.8091970,即输钱的概率是0.8091970
      

  5.   

    看来JAVA API掌握的还是不熟,很多东西都不会用,我没有想到用 java.util.LinkedList。看来以后还得努力啊
      

  6.   

    public class xingshao
    {
    public static void main(String args[])
    {
    keji x=new keji(530,0.7f);
    x.jiage=(int)x.getjiage(530,0.7f);
    x.showleixing();
    x.showjiage();
    wenyi y=new wenyi(530,0.7f);
    y.jiage=(int)y.getjiage(530,0.7f);
    y.showleixing();
    y.showjiage();
    jiaocai z=new jiaocai(530,0.7f);
    z.jiage=(int)z.getjiage(530,0.7f);
    z.showleixing();
    z.showjiage();
    }
    }
    interface book
    {
    abstract void showleixing();
    abstract double getjiage(int yema,float zhekou);
    }
    class keji implements book
    {
    int yema;
    float zhekou;
    double jiage;
    public keji(int yema,float zhekou)
    {
    this.yema=yema;
    this.zhekou=zhekou;
    }
    public void showleixing()
    {
    System.out.println("这本书是科技类书");
    }
    public double getjiage(int yema,float zhekou)
    {
    return yema*0.1*zhekou;
    }
    public void showjiage()
    {
    System.out.println("它的价格是:"+jiage);
    }
    }
    class wenyi implements book
    {
    int yema;
    float zhekou;
    double jiage;
    public wenyi(int yema,float zhekou)
    {
    this.yema=yema;
    this.zhekou=zhekou;
    }
    public void showleixing()
    {
    System.out.println("这本书是文艺类书");
    }
    public double getjiage(int yema,float zhekou)
    {
    return yema*0.08*zhekou;
    }
    public void showjiage()
    {
    System.out.println("它的价格是:"+jiage);
    }
    }
    class jiaocai implements book
    {
    int yema;
    float zhekou;
    double jiage;
    public jiaocai(int yema,float zhekou)
    {
    this.yema=yema;
    this.zhekou=zhekou;
    }
    public void showleixing()
    {
    System.out.println("这本书是教材类书");
    }
    public double getjiage(int yema,float zhekou)
    {
    return yema*0.05*zhekou;
    }
    public void showjiage()
    {
    System.out.println("它的价格是:"+jiage);
    }
    }