一个简单的概率算法

概率算法:假设我们有5个大小不等的面积(对应5个不同的奖项),共同组成一个圆,总面积为1(必须),那么随机一个double数字出来,它究竟落入哪一个小面,该面的id就是对应的奖项。

	/**
	 * 利用随机数,配合设定的概率,取得获得的奖项等次,【符合概率分布】
	 * @param list	数据库里设定的概率
	 * @return		随机获得的奖项等次
	 */
	public String getRandomId(List<Map<String, Object>> list){
		try {
			double randomNumber;
			randomNumber = Math.random();	//随机数
			double count=0;		//概率和
			int i = 0;
			//当randomNumber>[概率1],则比较randomNumber是不是大于[概率1]+[概率2],以此类推
			//直到randomNumber<[概率1]+[概率2]+..+[概率i],返回i。
			for(i=0;i<list.size();i++){
				count+=Double.parseDouble(list.get(i).get("prob").toString());
				if(randomNumber<count){
					break;
				}
			}
			return (i+1)+"";
		} catch (NumberFormatException e) {
			e.printStackTrace();
			return "100";
		}
		
	}


算法的意思是:多个概率的大小总和等于1,相当于一个半径为1的圆。当我们随机一个double数出来之后,将它与概率相比,如果第1个概率小于随机数,则第1个概率加上第二个概率与随机数相比,以此类推下去,必然有一个概率被加上之后能大于这个随机数,因为随机数的范围[0,1),而我们的圆的总面积是1.此时我们就能得到最后被加上的概率的位置,返回它的位置就是我们需要的结果。

下面测试一下:

	public static void main(String[] args) {
		
		//我从数据库查出的概率集合,有4个奖项,第5个是为了凑合1的总和,也可以是不中奖的1个概率。
		//分别是:0.1;   0.2;   0.2;   0.1;   0.4
		List<Map<String, Object>> list=(new LotteryService()).getProbability();
		LotteryUtil lt=new LotteryUtil();
		
		//6个计数,包含getRandomId()报错的情况。
		int count1=0;
		int count2=0;
		int count3=0;
		int count4=0;
		int count5=0;
		int countError=0;		
		for(int i=0;i<100;i++){
			int n=Integer.parseInt(lt.getRandomId(list));
			
			//当得到的奖项ID=1,则count1++,下同。
			if(n==1){	
				count1++;
			}
			else if(n==2){
				count2++;
			}
			else if(n==3){
				count3++;
			}
			else if(n==4){
				count4++;
			}
			else if(n==5){
				count5++;
			}else{
				countError++;
			}
			System.out.print(n+"\t");
		}
		System.out.println();
		
		//输出概率分布情况
		System.out.println(count1+":"+count2+":"+count3+":"+count4+":"+count5);
	}

运行结果:9:21:24:9:37

这个结果符合我们设定的比例:1:2:2:1:4,就是说,概率算法是正确的。

有的人可能会问,用面积来计算概率的话,如果概率的顺序调整一下,比如4:2:2:1:1,方法getRandomId()中count先后出现的结果就不一样,那与随机数比较的结果是不是就不一样了。

这里就要考虑到一个问题,那就是随机数,大家都知道随机数是没有规律出现的,也就是说在一定次数里面,每一个数字都有可能出现,换句话说就是分布平均的。

那么如果概率变换顺序,对于随机数来说还是平均分布,将随机数当成一个个点来看待,如果一个概率够大,那么落在其中的点就会更多,相反如果概率较小的则落点就少。那么概率分布就跟顺序没有关系了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值