Bootstrap

中奖概率计算

做移动的项目,有个需求,做个摇奖的活动!其中中奖的计算比较恶心,用户要改动各个奖项的中奖概率,而且每天的奖项有个数限制。一二三四五六等奖,概率不通,怎么算一个用户参与了中没中将呢?苦思了一下,可以用Random类的 nextInt(int x)方法产生一个范围内的随机数,产生到那个区间就是几等奖了,中奖区间的产生是动态的。贴出源代码,仅供参考!

package Mzone;

import java.util.ArrayList;
import java.util.Random;

public class Mzone {

    /**
    * CopyRright(c)2009-04:
    * Project:
    * Module ID:
    * Comments: 概率计算
    * JDK version used: <JDK1.4>
    * Author:ch
    * Create Date:2009-04-20
    * Modified By:
    * Modified Date:
    * Why & What is modified
    * Version: 1.0
    */
    static Random r = new Random();
   
    public static void main(String[] args) {
       
        //各个奖项的中奖概率的分母
        Integer _5m = new Integer(5);
        Integer _500m = new Integer(30);
        Integer _ipod = new Integer(500);
        Integer _phone = new Integer(1000);
        Integer _notebook = new Integer(1500);
        Integer _jay = new Integer(50);
       
        ArrayList list = new ArrayList();
       
        if(_5m.intValue()!=0)
            list.add(_5m);
        if(_500m.intValue()!=0)
            list.add(_500m);
        if(_ipod.intValue()!=0)
            list.add(_ipod);
        if(_phone.intValue()!=0)
            list.add(_phone);
        if(_notebook.intValue()!=0)
            list.add(_notebook);
        if(_jay.intValue()!=0)
            list.add(_jay);
       
        //计算最小公倍数
        int common = getN(list);
        System.out.println("最小公倍数:"+common);
       
        int a = 0;int b = 0;int c = 0;int d = 0;int e = 0;int f = 0;int g = 0;

        int first = 0;int second = 0;int third = 0;int four = 0;int fifth = 0;int sixth = 0;
       
        if(_5m.intValue()!=0){
            first = common/_5m.intValue();
        }
        if(_500m.intValue()!=0){
            second = first + (common/_500m.intValue());
        }else second = first;
        if(_ipod.intValue()!=0){
            third =  second + (common/_ipod.intValue());
        }else third = second;
        if(_phone.intValue()!=0){
            four =   third + (common/_phone.intValue());
        }else four = third;
        if(_notebook.intValue()!=0){
            fifth =  four + (common/_notebook.intValue());
        }else fifth = four;
        if(_jay.intValue()!=0){
            sixth =  fifth + (common/_jay.intValue());
        }else sixth = fifth;
           
        int times = 30000;//循环次数
       
        for(int i = 0;i < times; i++){
            int ri = getRandom(common);//产生随机数
           
            if(ri >= 0 && ri < first){
                a++;
            }else if(ri >= first && ri < second){
                b++;
            }else if(ri >= second && ri < third){
                c++;
            }else if(ri >= third && ri < four){
                d++;
            }else if(ri >= four && ri < fifth){
                e++;
            }else if(ri >= fifth && ri < sixth){
                f++;
            }else{
                g++;
            }
        }
       
        System.out.println("5m值:" + a + " 500m值:" + b + " ipodMP3:" + c + " 手机:" + d + " 笔记本电脑:" + e + " 演唱会门票:" + f + " 谢谢参与:" + g);
    }
   
    /**
     * 求最大公约数
    */
    public static int gcd(int m, int n){
        while (true){
            if ((m = m % n) == 0)
            return n;
            if ((n = n % m) == 0)
            return m;
        }
    }
   
    /**
    * 求最小公倍数
    */
    public static int gys(int z, int y){
        int t = 0;
        int c = 0;
        c = gcd(z,y);
        t = z * y / c;
       
        return t;
    }
   
    /**
     * 求几个数的最小公倍数
    */
    public static int getN(ArrayList list){
       
        int t = 1;
       
        for(int i = 0;i<list.size();i++){
            Integer temp = (Integer)list.get(i);
            t = gys(t,temp.intValue());
        }
        return t;
    }
   
    /**
     * 产生随机数
    */
    public static int getRandom(int y){
        int result = r.nextInt(y);
       
        return result;
    }
   
}

;