1. 程式人生 > 實用技巧 >OpenCV計算機視覺學習(11)——影象空間幾何變換(影象縮放,影象旋轉,影象翻轉,影象平移,仿射變換,映象變換)

OpenCV計算機視覺學習(11)——影象空間幾何變換(影象縮放,影象旋轉,影象翻轉,影象平移,仿射變換,映象變換)

技術標籤: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());
    }

在這裡插入圖片描述