OpenCV計算機視覺學習(11)——影象空間幾何變換(影象縮放,影象旋轉,影象翻轉,影象平移,仿射變換,映象變換)
阿新 • • 發佈:2020-11-14
技術標籤:java抽獎隨機java概率論演算法intellij idea
Java 實現自定義概率性配置並隨機抽取演算法
最近在做一個獎品抽取的活動,可以自定義配置每個獎品的中獎概率,獎品的抽獎數和概率都可以動態配置的。比如說配置電腦0%,手機10%,ipad 5%,謝謝惠顧60%,1元優惠券25%這種配置。話不多說且看實現。
實現思路
1、首先構造一個概率實體類。為了通用性使用,我們可以使用泛型做實際的抽獎實物。
程式碼如下
@Data
@Accessors(chain = true)
public class ProbabilityEntity<T> {
private T entity;//實體
private Integer id; // id 區別實體的id,每個實體保證唯一
private Double ProbabilityValue;//概率值,0.1-100---》0.1%--100%
}
2、通過讀取配置構造出概率實體列表,然後就可以抽獎了,抽獎演算法思路分為以下
a.公平性檢測
b. 基數建立
c. 基數分割槽
d.隨機抽取
e. 返回結果
程式碼如下
public class MyAlgorithmUtil {
private MyAlgorithmUtil() {
}
/**
* 概率性抽獎
* @param probabilityEntityList 概率配置列表
* @param defaultValue 不符條件返回的預設結果
* @param <T> 抽獎的實體
* @return
*/
public static <T> ProbabilityEntity<T> probabilityLottery(List<ProbabilityEntity<T>> probabilityEntityList,ProbabilityEntity<T> defaultValue) {
// 公平性檢測
if (probabilityEntityList.stream().mapToDouble(e -> e.getProbabilityValue()).summaryStatistics( ).getSum() != 100.00) {
System.out.println("概率總共不為1,公平性有偏差");
}
// 基數建立
Map<Integer, Integer> numbers = new HashMap<>();
for (ProbabilityEntity entity : probabilityEntityList) {
numbers.put(entity.getId(), (int) (entity.getProbabilityValue() * 10.0));
}
// 基數分割槽
int idxStart = 0;
int idxEnd = 0;
List<Integer> nums = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
nums.add(i);
}
Map<Integer, List<Integer>> numParts = new HashMap<>();
for (Map.Entry<Integer, Integer> entry : numbers.entrySet()) {
idxEnd = idxStart + entry.getValue();
if (idxEnd >= 1000) {
idxEnd = 1000;
}
if (entry.getValue() > 0) {
numParts.put(entry.getKey(), nums.subList(idxStart, idxEnd));
}
idxStart = idxEnd;
}
// 隨機抽取
Random random = new Random();
int r = random.nextInt(1000);
// 基礎概率數
for (Map.Entry<Integer, List<Integer>> entry : numParts.entrySet()) {
List<Integer> value = entry.getValue();
if (value.contains(r)) {
List<ProbabilityEntity> entities = probabilityEntityList.stream().filter(e -> e.getId().equals(entry.getKey())).collect(Collectors.toList());
if (entities != null && entities.size() > 0) {
return entities.get(0);
}
}
}
return defaultValue;
}
}
測試結果
public static void main(String[] args) {
List<ProbabilityEntity<String>> probabilityEntities = new ArrayList<>();
// 電腦0%,手機10%,ipad 5%,謝謝惠顧60%,1元優惠券25%
probabilityEntities.add(new ProbabilityEntity<String>().setProbabilityValue(0.0).setId(1).setEntity("電腦"));
probabilityEntities.add(new ProbabilityEntity<String>().setProbabilityValue(10.0).setId(2).setEntity("手機"));
probabilityEntities.add(new ProbabilityEntity<String>().setProbabilityValue(5.0).setId(3).setEntity("ipad"));
probabilityEntities.add(new ProbabilityEntity<String>().setProbabilityValue(60.0).setId(4).setEntity("謝謝惠顧"));
probabilityEntities.add(new ProbabilityEntity<String>().setProbabilityValue(25.0).setId(5).setEntity("1元優惠券"));
ProbabilityEntity<String> defaultThanks = new ProbabilityEntity<String>().setEntity("謝謝惠顧")
.setId(4).setProbabilityValue(0.0);
ProbabilityEntity<String> entity = MyAlgorithmUtil.probabilityLottery(probabilityEntities,defaultThanks);
System.out.println("**********-----中獎結果---***********");
System.out.println("恭喜你抽中了 "+entity.getEntity());
}