# 实现不同概率抽奖功能 转

xjcyxyx

 序号 物品名称 物品ID 抽奖概率 1 物品1 P1 0.2 2 物品2 P2 0.1 3 物品3 P3 0.4 4 物品4 P4 0.3 5 物品5 P5 0.0 6 物品6 P6 -0.1 7 物品7 P7 0.008

``````public class Gift {
private int index;
private String gitfId;
private double probability;

this.index = index;
this.gitfId = gitfId;
this.probability = probability;
}

public int getIndex() {
return index;
}

public void setIndex(int index) {
this.index = index;
}

public String getGitfId() {
return gitfId;
}

public void setGitfId(String gitfId) {
this.gitfId = gitfId;
}

}

}

public double getProbability() {
return probability;
}

public void setProbability(double probability) {
this.probability = probability;
}

@Override
public String toString() {
return "Gift [index=" + index + ", gitfId=" + gitfId + ", giftName=" + giftName + ", probability=" + probability + "]";
}

}``````
• Util类：LotteryUtil.java    真正的不同概率的抽奖工具类
``````import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
* 不同概率抽奖工具包
*
* @author Shunli
*/
public class LotteryUtil {
/**
* 抽奖
*
* @param orignalRates
*            原始的概率列表，保证顺序和实际物品对应
* @return
*         物品的索引
*/
public static int lottery(List<Double> orignalRates) {
if (orignalRates == null || orignalRates.isEmpty()) {
return -1;
}

int size = orignalRates.size();

// 计算总概率，这样可以保证不一定总概率是1
double sumRate = 0d;
for (double rate : orignalRates) {
sumRate += rate;
}

// 计算每个物品在总概率的基础下的概率情况
List<Double> sortOrignalRates = new ArrayList<Double>(size);
Double tempSumRate = 0d;
for (double rate : orignalRates) {
tempSumRate += rate;
}

// 根据区块值来获取抽取到的物品索引
double nextDouble = Math.random();
Collections.sort(sortOrignalRates);

return sortOrignalRates.indexOf(nextDouble);
}
}``````
• Test类：Test.java
``````import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

/**
* 不同概率抽奖
*
* @author ShunLi
*/
public class LotteryTest {
public static void main(String[] args) {
// 序号==物品Id==物品名称==概率

if (probability < 0) {
probability = 0;
}
}

// statistics
Map<Integer, Integer> count = new HashMap<Integer, Integer>();
double num = 1000000;
for (int i = 0; i < num; i++) {
int orignalIndex = LotteryUtil.lottery(orignalRates);

Integer value = count.get(orignalIndex);
count.put(orignalIndex, value == null ? 1 : value + 1);
}

for (Entry<Integer, Integer> entry : count.entrySet()) {
System.out.println(gifts.get(entry.getKey()) + ", count=" + entry.getValue() + ", probability=" + entry.getValue() / num);
}
}

}``````

2. 所有礼物加起来的概率可以不是1，可以认为这里的概率是一个权重；

### 评论(1)

Peason/jcbase-wx-song

Peason ⋅ 2016/10/26 ⋅ 0

php几个常用的概率算法（抽奖、广告首选）

php+jquery实现转盘抽奖 概率可任意调

php+jquery实现转盘抽奖 概率可任意调 php+jquery实现转盘抽奖 概率可任意调 Posted by: xiaomiao 2014/05/13in Code, PHP 3 Comments php+jquery实现转盘抽奖 查看DEMO演示 转盘抽奖，炫丽的...

【码云周刊第 59 期】你想要的年会抽奖开源项目都在这里！

js幸运大转盘开发

1.关于本文 本文旨在模拟一种非常坑爹的抽奖形式-不等概率的抽奖（当然，这种抽奖形式在现在已经得到了非常普遍的应用） 程序下载地址：http://pan.baidu.com/s/1hETHk 2.抽奖系统抽奖规则 ...

IceRainYWC ⋅ 2012/09/18 ⋅ 12

JavaScript零基础入门——（八）JavaScript的数组

JavaScript零基础入门——（八）JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门，上一节课我们讲了有关JavaScript正则表达式的相关知识点，便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

p柯西 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e：编辑该用户的计时器设置； -l：列出该用户的计时器设置； -r：删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域，编译器和处理器要遵守两个重排序规则： （1）在构造函数内对一个final域的写入，与随后把这个被构造对象的引用赋值给一个引用...

Spring 依赖注入（DI）

1、Setter方法注入： 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法： public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

go4it ⋅ 昨天 ⋅ 0