抽奖

根据概率随机

package com.lalala.test;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

/**
 * 测试 抽奖概率问题
 */
public class TokenAward {
    public static void main(String[] args) {
        Take take = new Take();
        int[] result = new int[5];
        Prize p1 = new Prize(1, "奥迪", 0.0000000001);
        Prize p2 = new Prize(1, "小车",  0.002);
        Prize p3 = new Prize(1, "笔记本",  0.003);
        Prize p4 = new Prize(1, "铅笔",  0.4);
        Prize p5 = new Prize(1, "未中奖!!!", 0.8);
        List<Prize> list = new ArrayList<>();
        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);
        list.add(p5);
        for (int i = 1; i <= 10000; i++) {

            int index = take.getPrizeIndex(list);
            System.out.println("第" + i + "次抽中的奖品为:" + list.get(index).getName());
            result[index]++;
            System.out.println("--------------------------------");
        }
        System.out.println("抽奖结束");
        System.out.println("每种奖品抽到的数量为:");
        System.out.println("一等奖:" + result[0]);
        System.out.println("二等奖:" + result[1]);
        System.out.println("三等奖:" + result[2]);
        System.out.println("四等奖:" + result[3]);
        System.out.println("五等奖:" + result[4]);
    }
}

class Take {
    /**
     * 根据Math.random()产生一个double型的随机数,判断每个奖品出现的概率
     *
     * @param prizes
     * @return random:奖品列表prizes中的序列(prizes中的第random个就是抽中的奖品)
     */
    public synchronized int getPrizeIndex(List<Prize> prizes) {
        int random = -1;
        try {
            //计算总概率
            double count = 0;
            for (Prize p : prizes) {
                count += p.getProbabillity();
            }
            //产生随机数
            double randomNumber = Math.random();
            //根据随机数在所有奖品分布的区域并确认所抽奖品
            double d1 = 0;
            double d2 = 0;

            for (int i = 0; i < prizes.size(); i++) {
                d2 += Double.parseDouble(String.valueOf(prizes.get(i).getProbabillity()))/count;
                if (i == 0) {
                    d1 = 0;
                } else {
                    d1 += Double.parseDouble(String.valueOf(prizes.get(i - 1).getProbabillity()))/count;
                }
                if (randomNumber >= d1 && randomNumber <= d2) {
                    random = i;
                    break;
                }
            }
        } catch (Exception e) {
            System.out.println("抽奖出现异常,请重试---出错原因:-->>" + e.getMessage());
        }
        return random;
    }
}

class Prize {
    private int id;//奖品id
    private String name;//奖品名称
    private double probabillity;//概率

    public Prize(int id, String name, double probabillity) {
        this.id = id;
        this.name = name;
        this.probabillity = probabillity;
    }

    public Prize() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }



    public double getProbabillity() {
        return probabillity;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值