JAVA 生成随机数,并根据后台概率灵活生成

     最近碰到一个大转盘的业务,奖品可根据数据后台灵活设置中奖概率,看起来挺简单的业务功能,但实现起来对我这个毫无经验的人来说并不容易,

后面又碰到一个根据后台概率随机获取不同概率的档位积分,前面是两个实际中业务要用到的话不多说吧,直接上我写概率工具类吧。

1:第一种方法

/**
* 根据概率 获取随机积分

* @param rdm
* @return
*/

       //这里的参数是一个存储概率集合当然你也可以用数组
public static Integer randomPoints(ArrayList<Double> rdm) {

     
ArrayList<Double> cdm = rdm;

//这里是将概率集合重组 比如 0.2 0.3 0.1 0.4  四个数据的集合 

for (int i = 1; i < cdm.size() - 1; i++) {
cdm.set(i, cdm.get(i) + cdm.get(i - 1));
}


cdm.set(cdm.size() - 1, 1.0);

//重组后 变成0.2 0.5 0.6 1.0   四个数据的集合
 double randomNumber;  
 randomNumber = Math.random();

//随机生成一个0到1的随机数

//接下就很简单了你只要循环重组集合 如果随机数小于那个值 就是返回 I 就好了  

for(int i=0;i<cdm.size();i++){

if(randomNumber<cdm.get(i)){

return i;
}


}

  return -1; // 正常情况之下不应该到这一步的。因为cdf的最后一个概率应该是1

}


2:第二种方法

这个是网上找到的 原理也是一样 不过这里用法比较固定,但效率明显比第一个更高

  1. public class MathRandom  
  2. {  
  3.  /** 
  4.      * 0出现的概率为%50 
  5.      */  
  6.  public static double rate0 = 0.50;  
  7.  /** 
  8.      * 1出现的概率为%20 
  9.      */  
  10.  public static double rate1 = 0.20;  
  11.  /** 
  12.      * 2出现的概率为%15 
  13.      */  
  14.  public static double rate2 = 0.15;  
  15.  /** 
  16.      * 3出现的概率为%10 
  17.      */  
  18.  public static double rate3 = 0.10;  
  19.  /** 
  20.      * 4出现的概率为%4 
  21.      */  
  22.  public static double rate4 = 0.04;  
  23.  /** 
  24.      * 5出现的概率为%1 
  25.      */  
  26.  public static double rate5 = 0.01;  
  27.   
  28.  /** 
  29.   * Math.random()产生一个double型的随机数,判断一下 
  30.   * 例如0出现的概率为%50,则介于0到0.50中间的返回0 
  31.      * @return int 
  32.      * 
  33.      */  
  34.  private int PercentageRandom()  
  35.  {  
  36.   double randomNumber;  
  37.   randomNumber = Math.random();  
  38.   if (randomNumber >= 0 && randomNumber <= rate0)  
  39.   {  
  40.    return 0;  
  41.   }  
  42.   else if (randomNumber >= rate0 && randomNumber <= rate0 + rate1)  
  43.   {  
  44.    return 1;  
  45.   }  
  46.   else if (randomNumber >= rate0 + rate1  
  47.     && randomNumber <= rate0 + rate1 + rate2)  
  48.   {  
  49.    return 2;  
  50.   }  
  51.   else if (randomNumber >= rate0 + rate1 + rate2  
  52.     && randomNumber <= rate0 + rate1 + rate2 + rate3)  
  53.   {  
  54.    return 3;  
  55.   }  
  56.   else if (randomNumber >= rate0 + rate1 + rate2 + rate3  
  57.     && randomNumber <= rate0 + rate1 + rate2 + rate3 + rate4)  
  58.   {  
  59.    return 4;  
  60.   }  
  61.   else if (randomNumber >= rate0 + rate1 + rate2 + rate3 + rate4  
  62.     && randomNumber <= rate0 + rate1 + rate2 + rate3 + rate4  
  63.       + rate5)  
  64.   {  
  65.    return 5;  
  66.   }  
  67.   return -1;  
  68.  }  
  69. }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值