JAVA 生成随机数并根据后台概率灵活生成的实例代码
作者:hua18123870251 发布时间:2023-12-05 11:00:48
标签: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;
}
}
来源:http://blog.csdn.net/hua18123870251/article/details/50384939


猜你喜欢
- 一、多线程的sleep方法1.Thread.sleep(毫秒)2.sleep方法是一个静态方法3.该方法的作用:阻塞当前线程,腾出CPU,让
- Android Studio从3.0版本新增了许多功能,当然首当其冲就是从3.0版本新增了对 Kotlin 开发语言的支持,除此之外还有其他
- 快速幂取模算法的引入是从大数的小数取模的朴素算法的局限性所提出的,在朴素的方法中我们计算一个数比如5^1003%31是非常消耗我们的计算资源
- /给三个整数从小到大排序并求和及其平均值//其中,三个待求整数及其排序的结果由引用参数传递;其和由输出参数传递;平均值由返回值返回。//在M
- Android Notification使用详解Notification核心代码(链式调用):适用于Android 4.0以上(
- 有时候,我们需要在线上预览word文档,当然我们可以用NPOI抽出Word中的文字和表格,然后显示到网页上面,但是这样会丢失掉Word中原有
- 上一次自己写了一个多线程断点续传下载的demo,过于麻烦,bug超多,所以我学习使用xutils来完成此功能。先将xutils依赖搭建好(上
- 本文实例讲述了Java比较两个List的值是否相等的方法。分享给大家供大家参考。具体如下:假设两个队列 {1,2,3,4} 和 {4,3,2
- 这篇文章主要介绍了springboot 定时任务@Scheduled实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的
- 如下所示:String.valueOf((char)10)在导出excel 的时候,如果原始文字中含有 \n 字符, 如果把 \n 替换为&
- 报错信息如下:java: 无法访问org.springframework.boot.SpringApplication错误的类文件: /C:
- 本文实例讲述了C#预处理器指令的用法。分享给大家供大家参考。具体用法分析如下:C#预处理器指令是在编译时调用的。预处理器指令(preproc
- 简介Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效
- 本文实例讲述了C#实现读取指定盘符硬盘序列号的方法。分享给大家供大家参考,具体如下:using System;using System.IO
- springboot对压缩请求的处理最近对接银联需求,为了节省带宽,需要对报文进行压缩处理。但是使用springboot自带的压缩设置不起作
- 本文实例讲述了java实现word文档转pdf并添加水印的方法。分享给大家供大家参考,具体如下:前段时间,项目需要自动生成word文档,用W
- 今天在接手别人的一个项目的时候遇到一个坑,坑死我了;是一个打包的问题,好不容易我把代码写完了准备打包测试了,结果java -jar xxx.
- java 弹幕小游戏的最初版本,供大家参考,具体内容如下最近在学习javaSE,根据b站视频老师的讲解,也参考了他的代码,做了一个弹幕小游戏
- 1.概述Spring Boot Admin是一个Web应用程序,用于管理和监视Spring Boot应用程序。每个应用程序都被视为客户端,并
- class文件中的访问标志信息位于常量池下面的2个字节是access_flags 。 access_flags 描述的是当前类(或