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:第二种方法

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

public class MathRandom
{
 /**
   * 0出现的概率为%50
   */
 public static double rate0 = 0.50;
 /**
   * 1出现的概率为%20
   */
 public static double rate1 = 0.20;
 /**
   * 2出现的概率为%15
   */
 public static double rate2 = 0.15;
 /**
   * 3出现的概率为%10
   */
 public static double rate3 = 0.10;
 /**
   * 4出现的概率为%4
   */
 public static double rate4 = 0.04;
 /**
   * 5出现的概率为%1
   */
 public static double rate5 = 0.01; 

 /**
 * Math.random()产生一个double型的随机数,判断一下
 * 例如0出现的概率为%50,则介于0到0.50中间的返回0
   * @return int
   *
   */
 private int PercentageRandom()
 {
 double randomNumber;
 randomNumber = Math.random();
 if (randomNumber >= 0 && randomNumber <= rate0)
 {
  return 0;
 }
 else if (randomNumber >= rate0 && randomNumber <= rate0 + rate1)
 {
  return 1;
 }
 else if (randomNumber >= rate0 + rate1
  && randomNumber <= rate0 + rate1 + rate2)
 {
  return 2;
 }
 else if (randomNumber >= rate0 + rate1 + rate2
  && randomNumber <= rate0 + rate1 + rate2 + rate3)
 {
  return 3;
 }
 else if (randomNumber >= rate0 + rate1 + rate2 + rate3
  && randomNumber <= rate0 + rate1 + rate2 + rate3 + rate4)
 {
  return 4;
 }
 else if (randomNumber >= rate0 + rate1 + rate2 + rate3 + rate4
  && randomNumber <= rate0 + rate1 + rate2 + rate3 + rate4
   + rate5)
 {
  return 5;
 }
 return -1;
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • JAVA 根据设置的概率生成随机数的方法

    本文介绍了JAVA 根据设置的概率生成随机数的方法,分享给大家 import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; public class RandomTest { // String 可以为任意类型 也可以自定义类型 static Map<String, Integer> keyChanceMap

  • JAVA 生成随机数并根据后台概率灵活生成的实例代码

    最近碰到一个大转盘的业务,奖品可根据数据后台灵活设置中奖概率,看起来挺简单的业务功能,但实现起来对我这个毫无经验的人来说并不容易,后面又碰到一个根据后台概率随机获取不同概率的档位积分,前面是两个实际中业务要用到的话不多说吧,直接上我写概率工具类吧. 1:第一种方法 /** * 根据概率 获取随机积分 * * @param rdm * @return */ //这里的参数是一个存储概率集合当然你也可以用数组 public static Integer randomPoints(ArrayList<

  • Java 两种延时thread和timer详解及实例代码

    Java 两种延时thread和timer详解及实例代码 在Java中有时候需要使程序暂停一点时间,称为延时.普通延时用Thread.sleep(int)方法,这很简单.它将当前线程挂起指定的毫秒数.如 try { Thread.currentThread().sleep(1000);//毫秒 } catch(Exception e){} 在这里需要解释一下线程沉睡的时间.sleep()方法并不能够让程序"严格"的沉睡指定的时间.例如当使用5000作为sleep()方法的参数时,线 程

  • java 单播、广播、组播详解及实例代码

    java 单播.广播.组播详解及实例代码 在当前网络通信中(TCP/IP也不例外)有三种通信模式:单播.广播.组播(又叫多播, 个人感觉叫多播描述的有点不恰当),其中多播出现的时间最晚,但同时具备单播和广播的优点,最具有发展前景. 一.通信方式分类: 1.单播:单台主机与单台主机之间的通信: 2.广播:单台主机与网络中所有主机的通信: 3.组播:单台主机与选定的一组主机的通信: 二.单播:    单播是网络通信中最常见的,网络节点之间的通信 就好像是人们之间的对话一样.如果一个人对另外一个人说话

  • Java反射之通过反射获取一个对象的方法信息(实例代码)

    以下代码为一个工具类 package com.imooc.reflect; import java.lang.reflect.Method; public class ClassUtil { public static void printClassMessage(Object obj){ //要获取类的信息,首先要获取类的类类型 Class c = obj.getClass();//传递的是哪个子类的对象,c就是该子类的类类型 //获取类的名称 System.out.println("类的名称

  • java 发送带Basic Auth认证的http post请求实例代码

    构造http header private static final String URL = "url"; private static final String APP_KEY = "key"; private static final String SECRET_KEY = "secret"; /** * 构造Basic Auth认证头信息 * * @return */ private String getHeader() { String

  • java 遍历request中的所有表单数据的实例代码

    实例如下: Enumeration rnames=request.getParameterNames(); for (Enumeration e = rnames ; e.hasMoreElements() ;) { String thisName=e.nextElement().toString(); String thisValue=request.getParameter(thisName); System.out.println(thisName+"-------"+thisV

  • java编程实现杨辉三角两种输出结果实例代码

    首先展示下结果: 简介: 杨辉三角,是二项式系数在三角形中的一种几何排列.在欧洲,这个表叫做帕斯卡三角形.帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年.杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的优美结合. 实例代码如下: package com.sxt; import java.util.Arrays; public class KeBen { p

  • springMVC前台传数组类型,后台用list类型接收实例代码

    springMVC后台处理数组对象. list类型的参数,接收前台的数组值,实验了一下,结果还真可以. 不用绑定到对象里面. 当然我这个是前台传递了个包含的是string的数组到后台,然后,后台用list来接收. 具体如下: 前台代码: //发送请求到后台,带数组形式的数据. function testList() { var data = getTreeViewCheckedData(); $.ajax({ url: APP_NAME + "xxxx/testList", data:

  • Java下http下载文件客户端和上传文件客户端实例代码

    一.下载客户端代码 package javadownload; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; /** * @说明 导出虚拟机 * @author wxt * @version 1

  • Java编程实现计算两个日期的月份差实例代码

    本文实例主要实现计算两个日期的月份差,具体如下: package com.forezp.util; import org.joda.time.DateTime; import org.joda.time.Months; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; /** * 在JAVA中,如何计算两个日期的月份差?<br> * * * @author Adm

随机推荐