有抽奖自然就有三六九等,自然又是金字塔模式。下面贴出我的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实现权重的简单算法相关推荐

  1. java 权重_java实现权重随机算法

    权重随机算法在抽奖,资源调度等系统中应用还是比较广泛的,一个简单的按照权重来随机的实现,权重为几个随机对象(分类)的命中的比例,权重设置越高命中越容易,之和可以不等于100: 简单实现代码如下: im ...

  2. java 抽奖_JAVA基于权重的抽奖

    https://blog.csdn.net/huyuyang6688/article/details/50480687 如有4个元素A.B.C.D,权重分别为1.2.3.4,随机结果中A:B:C:D的 ...

  3. 简单java数组程序_java(数组及常用简单算法 )

    数组 数组:数组是存储同一种数据类型数据的集合容器. 数组的定义格式: 数据类型[]  变量名  =  new  数据类型[长度]; 数组的好处:对分配到数组对象中每一个数据都分配一个编号(索引值.角 ...

  4. java 取绝对值_Java实现一致性哈希算法,并搭建环境测试其负载均衡特性

    实现负载均衡是后端领域一个重要的话题,一致性哈希算法是实现服务器负载均衡的方法之一,你很可能已在一些远程服务框架中使用过它.下面我们尝试一下自己实现一致性哈希算法. 一. 简述一致性哈希算法 这里不详 ...

  5. java 排序_Java中常见的排序算法有哪些?---选择排序

    排序相关的的基本概念 排序: 将一组杂乱无章的数据按一定的规律顺次排列起来. 数据表( data list): 它是待排序数据对象的有限集合. 排序码(key):通常数据对象有多个属性域, 即多个数据 ...

  6. java可达性_java垃圾回收机制--可达性算法

    先说一些题外话,Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区,这些区分为线程私有区和线程共享区 1.线程私有区 a.程序计数器 记录正在执行的虚拟机字节码指令地址 ...

  7. 票据ticket实现方式java代码_Java代码实践12306售票算法(二)

    周五闲来无事,基于上一篇关于浅析12306售票算法(java版)理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1初始化一列车厢的票据信息 /** * 生成 ...

  8. java 围棋_Java.awt实现一个简单的围棋

    目录 0.前言 我小时候学过一段时间的围棋,可惜脑子不好使,是个臭棋篓子,到现在也有十多年的时间没有下过棋了,但是近几年围棋AI的出现,又让我重新关注了围棋 围棋真的很有意思,千变万化,有人简明的围空 ...

  9. 售票java代码_Java代码实践12306售票算法(二)

    周五闲来无事,基于上一篇关于浅析12306售票算法(java版)理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1初始化一列车厢的票据信息 /** * 生成 ...

  10. 密码锁 java接口_Java实现 蓝桥杯VIP 算法提高 密码锁

    算法提高 题目 2 密码锁 时间限制:1.0s 内存限制:1.0GB 问题描述 你获得了一个据说是古代玛雅人制作的箱子.你非常想打开箱子看看里面有什么东西,但是不幸的是,正如所有故事里一样,神秘的箱子 ...

最新文章

  1. Item 36. Class-Specific Memory Management
  2. 尺度不变性是指什么不变_不变性如何提供帮助
  3. 【JAVA基础篇】内部类
  4. 为什么要学python语言、学完有什么好处_学编程为什么首选Python?学完Python的优势有哪些?...
  5. 10分钟学会python函数式编程,赶紧收藏!!
  6. mongodb 查询内嵌文档
  7. 彻底扔掉PostMan了,这套国产替代方案是真的香…
  8. 美团配送A/B平台评估体系建设与实践
  9. Oracle浅谈第六回
  10. oracle 知识点
  11. Redmine(Ruby)配置经验
  12. Linux系统文件管理以及连接文件和inode简介
  13. CentOS7恢复rm -rf 误删的xfs系统
  14. react native使用echarts图表
  15. 史丰收速算-第五届蓝桥杯省赛
  16. 职业定位测试/职业能力倾向测试
  17. 2012人类将从“微博体”过渡到“微媒体”。至于你信不信,反正我信了
  18. ffmpeg播放器实现详解 - 快进快退控制
  19. mac 软件卸载后无法安装
  20. Google(谷歌)正在构造可怕的帝国

热门文章

  1. 简单图形的输入输出练习
  2. opencv python 常用方法
  3. 如何在python同一行内输入若干个数?
  4. Java工程师进阶,Java全栈知识体系
  5. 《社会心理学》第一章读书笔记
  6. 百年通信史:落后西方半世纪的中国,用20年绝地反杀!
  7. 如何做好一场技术分享,100%纯实用技巧输出
  8. prosody之component
  9. 制作Windows官方系统启动盘
  10. CPU0704报错处理