java 权重_java实现权重的简单算法
有抽奖自然就有三六九等,自然又是金字塔模式。下面贴出我的demo代码,然后一一解答。文章尾部有我的参考链接,大部分代码来源于他,我只是稍微优化。
import java.util.ArrayList;
import java.util.List;
/**
* Created by liyang on 2017/7/13.
*/
public class PrizeTest {
/**
* 根据Math.random()产生一个double型的随机数,判断每个供应商出现的概率
* @param prizes
* @return random:奖品列表prizes中的序列(prizes中的第random个就是抽中的奖品)
*/
public static int getPrizeIndex(List prizes) {
int random = -1;
while(random < 0 ) {
try {
//计算总权重
double sumWeight = 0;
for (Prize p : prizes) {
sumWeight += p.getPrize_weight();
}
//产生随机数
double randomNumber;
randomNumber = Math.random();
//根据随机数在所有奖品分布的区域并确定哪个供应商
double d1 = 0;
double d2 = 0;
for (int i = 0; i < prizes.size(); i++) {
d2 += Double.parseDouble(String.valueOf(prizes.get(i).getPrize_weight())) / sumWeight;
if (i == 0) {
d1 = 0;
} else {
d1 += Double.parseDouble(String.valueOf(prizes.get(i - 1).getPrize_weight())) / sumWeight;
}
if (d1 <= randomNumber && randomNumber < d2) {
random = i;
break;
}
}
} catch (Exception e) {
System.out.println("出错原因:" + e.getMessage());
}
}
return random;
}
public static void main(String[] agrs) {
int i = 0;
List prizes = new ArrayList();
Prize p1 = new Prize();
p1.setPrize_name("供应商1");
p1.setPrize_weight(1);//权重设置成1
prizes.add(p1);
Prize p2 = new Prize();
p2.setPrize_name("供应商2");
p2.setPrize_weight(2);//权重设置成2
prizes.add(p2);
Prize p3 = new Prize();
p3.setPrize_name("供应商3");
p3.setPrize_weight(3);//权重设置成3
prizes.add(p3);
Prize p4 = new Prize();
p4.setPrize_name("供应商4");
p4.setPrize_weight(4);//权重设置成4
prizes.add(p4);
int[] result=new int[prizes.size()];
System.out.println("开始.。。");
for (i = 0; i < 100; i++)// 打印100个测试概率的准确性
{
System.out.println("第"+i+"次使用:"+prizes.get(getPrizeIndex(prizes)).getPrize_name());
result[getPrizeIndex(prizes)]++;
System.out.println("--------------------------------");
}
System.out.println("结束。。。");
System.out.println("每家供应商的使用数量为:");
System.out.println("供应商1:"+result[0]);
System.out.println("供应商2:"+result[1]);
System.out.println("供应商3:"+result[2]);
System.out.println("供应商4:"+result[3]);
}
static class Prize{
private String prize_name;//名称
private int prize_weight;//权重
public String getPrize_name() {
return prize_name;
}
public void setPrize_name(String prize_name) {
this.prize_name = prize_name;
}
public int getPrize_weight() {
return prize_weight;
}
public void setPrize_weight(int prize_weight) {
this.prize_weight = prize_weight;
}
}
}
第一步:新建一个奖品实体
奖品实体必须含有两个字段,一个用于区分的名称/ID;一个权重
第二步:权重的核心算法
for (int i = 0; i < prizes.size(); i++) {
d2 += Double.parseDouble(String.valueOf(prizes.get(i).getPrize_weight())) / sumWeight;
if (i == 0) {
d1 = 0;
} else {
d1 += Double.parseDouble(String.valueOf(prizes.get(i - 1).getPrize_weight())) / sumWeight;
}
if (d1 <= randomNumber && randomNumber < d2) {
random = i;
break;
}
}
我用一个表格展示循环的一周期,其中demo为了好计算,4个样例凑了个整数10,概率分别为0.1-0.2-0.3-0.4,实际使用过程中分子分母是分开计算的,不需非得凑整数且允许单个样例权重为0但不能为负数。
次数
d1
d2
概率区间
1
0
1/10
0 --1/10
2
1/10
3/10
1/10--3/10
3
3/10
6/10
3/10--6/10
4
6/10
1
6/10--10/10
原理就是利用Math.random()每次获取的值0<= x<1的随机分布,从而根据各自的概率比值来实现权重。
double randomNumber;
randomNumber = Math.random();
java 权重_java实现权重的简单算法相关推荐
- java 权重_java实现权重随机算法
权重随机算法在抽奖,资源调度等系统中应用还是比较广泛的,一个简单的按照权重来随机的实现,权重为几个随机对象(分类)的命中的比例,权重设置越高命中越容易,之和可以不等于100: 简单实现代码如下: im ...
- java 抽奖_JAVA基于权重的抽奖
https://blog.csdn.net/huyuyang6688/article/details/50480687 如有4个元素A.B.C.D,权重分别为1.2.3.4,随机结果中A:B:C:D的 ...
- 简单java数组程序_java(数组及常用简单算法 )
数组 数组:数组是存储同一种数据类型数据的集合容器. 数组的定义格式: 数据类型[] 变量名 = new 数据类型[长度]; 数组的好处:对分配到数组对象中每一个数据都分配一个编号(索引值.角 ...
- java 取绝对值_Java实现一致性哈希算法,并搭建环境测试其负载均衡特性
实现负载均衡是后端领域一个重要的话题,一致性哈希算法是实现服务器负载均衡的方法之一,你很可能已在一些远程服务框架中使用过它.下面我们尝试一下自己实现一致性哈希算法. 一. 简述一致性哈希算法 这里不详 ...
- java 排序_Java中常见的排序算法有哪些?---选择排序
排序相关的的基本概念 排序: 将一组杂乱无章的数据按一定的规律顺次排列起来. 数据表( data list): 它是待排序数据对象的有限集合. 排序码(key):通常数据对象有多个属性域, 即多个数据 ...
- java可达性_java垃圾回收机制--可达性算法
先说一些题外话,Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区,这些区分为线程私有区和线程共享区 1.线程私有区 a.程序计数器 记录正在执行的虚拟机字节码指令地址 ...
- 票据ticket实现方式java代码_Java代码实践12306售票算法(二)
周五闲来无事,基于上一篇关于浅析12306售票算法(java版)理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1初始化一列车厢的票据信息 /** * 生成 ...
- java 围棋_Java.awt实现一个简单的围棋
目录 0.前言 我小时候学过一段时间的围棋,可惜脑子不好使,是个臭棋篓子,到现在也有十多年的时间没有下过棋了,但是近几年围棋AI的出现,又让我重新关注了围棋 围棋真的很有意思,千变万化,有人简明的围空 ...
- 售票java代码_Java代码实践12306售票算法(二)
周五闲来无事,基于上一篇关于浅析12306售票算法(java版)理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1初始化一列车厢的票据信息 /** * 生成 ...
- 密码锁 java接口_Java实现 蓝桥杯VIP 算法提高 密码锁
算法提高 题目 2 密码锁 时间限制:1.0s 内存限制:1.0GB 问题描述 你获得了一个据说是古代玛雅人制作的箱子.你非常想打开箱子看看里面有什么东西,但是不幸的是,正如所有故事里一样,神秘的箱子 ...
最新文章
- Item 36. Class-Specific Memory Management
- 尺度不变性是指什么不变_不变性如何提供帮助
- 【JAVA基础篇】内部类
- 为什么要学python语言、学完有什么好处_学编程为什么首选Python?学完Python的优势有哪些?...
- 10分钟学会python函数式编程,赶紧收藏!!
- mongodb 查询内嵌文档
- 彻底扔掉PostMan了,这套国产替代方案是真的香…
- 美团配送A/B平台评估体系建设与实践
- Oracle浅谈第六回
- oracle 知识点
- Redmine(Ruby)配置经验
- Linux系统文件管理以及连接文件和inode简介
- CentOS7恢复rm -rf 误删的xfs系统
- react native使用echarts图表
- 史丰收速算-第五届蓝桥杯省赛
- 职业定位测试/职业能力倾向测试
- 2012人类将从“微博体”过渡到“微媒体”。至于你信不信,反正我信了
- ffmpeg播放器实现详解 - 快进快退控制
- mac 软件卸载后无法安装
- Google(谷歌)正在构造可怕的帝国