最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java抽獎(jiǎng)算法第二例

 更新時(shí)間:2021年09月17日 11:03:26   作者:go2shell  
這篇文章主要為大家詳細(xì)介紹了Java抽獎(jiǎng)算法,根據(jù)概率將獎(jiǎng)品劃分區(qū)間,每個(gè)區(qū)間代表一個(gè)獎(jiǎng)品,然后抽取隨機(jī)數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了java抽獎(jiǎng)算法,供大家參考,具體內(nèi)容如下

1. 算法分析

根據(jù)概率將獎(jiǎng)品劃分區(qū)間,每個(gè)區(qū)間代表一個(gè)獎(jiǎng)品,然后抽取隨機(jī)數(shù),反查落在那個(gè)區(qū)間上,即為所抽取的獎(jiǎng)品。

2.代碼

核心算法 

public class Arithmetic {
  // 放大倍數(shù)
  private static final int mulriple = 1000000;

  public int pay(List<Prize> prizes) {
    int lastScope = 0;
    // 洗牌,打亂獎(jiǎng)品次序
    Collections.shuffle(prizes);
    Map<Integer, int[]> prizeScopes = new HashMap<Integer, int[]>();
    Map<Integer, Integer> prizeQuantity = new HashMap<Integer, Integer>();
    for (Prize prize : prizes) {
      int prizeId = prize.getPrizeId();
      // 劃分區(qū)間
      int currentScope = lastScope + prize.getProbability().multiply(new BigDecimal(mulriple)).intValue();
      prizeScopes.put(prizeId, new int[] { lastScope + 1, currentScope });
      prizeQuantity.put(prizeId, prize.getQuantity());

      lastScope = currentScope;
    }

    // 獲取1-1000000之間的一個(gè)隨機(jī)數(shù)
    int luckyNumber = new Random().nextInt(mulriple);
    int luckyPrizeId = 0;
    // 查找隨機(jī)數(shù)所在的區(qū)間
    if ((null != prizeScopes) && !prizeScopes.isEmpty()) {
      Set<Entry<Integer, int[]>> entrySets = prizeScopes.entrySet();
      for (Map.Entry<Integer, int[]> m : entrySets) {
        int key = m.getKey();
        if (luckyNumber >= m.getValue()[0] && luckyNumber <= m.getValue()[1] && prizeQuantity.get(key) > 0) {
          luckyPrizeId = key;
          break;
        }
      }
    }

    if (luckyPrizeId > 0) {
      // 獎(jiǎng)品庫(kù)存減一
    }

    return luckyPrizeId;
  }
}

Prize bean

public class Prize {

  /**
   * 獎(jiǎng)品唯一標(biāo)示
   */
  private Integer prizeId;

  /**
   * 中獎(jiǎng)概率
   */
  private BigDecimal probability;

  /**
   * 獎(jiǎng)品數(shù)量
   */
  private Integer quantity;

  public Integer getPrizeId() {
    return prizeId;
  }

  public void setPrizeId(Integer prizeId) {
    this.prizeId = prizeId;
  }

  public BigDecimal getProbability() {
    return probability;
  }

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

  public Integer getQuantity() {
    return quantity;
  }

  public void setQuantity(Integer quantity) {
    this.quantity = quantity;
  }

}

3.測(cè)試

prize1概率: 5% 
prize2概率: 10% 

prize3概率: 15% 
prize4概率: 20% 

prize5概率: 50% 


public class Test {
  public static void main(String[] args) {
    List<Prize> prizes = new ArrayList<Prize>();
    Prize prize1 = new Prize();
    prize1.setPrizeId(1);
    prize1.setProbability(new BigDecimal(0.05));
    prize1.setQuantity(1);
    prizes.add(prize1);

    Prize prize2 = new Prize();
    prize2.setPrizeId(2);
    prize2.setProbability(new BigDecimal(0.10));
    prize2.setQuantity(10);
    prizes.add(prize2);

    Prize prize3 = new Prize();
    prize3.setPrizeId(3);
    prize3.setProbability(new BigDecimal(0.15));
    prize3.setQuantity(20);
    prizes.add(prize3);

    Prize prize4 = new Prize();
    prize4.setPrizeId(4);
    prize4.setProbability(new BigDecimal(0.20));
    prize4.setQuantity(50);
    prizes.add(prize4);

    Prize prize5 = new Prize();
    prize5.setPrizeId(5);
    prize5.setProbability(new BigDecimal(0.50));
    prize5.setQuantity(200);
    prizes.add(prize5);

    int prize1GetTimes = 0;
    int prize2GetTimes = 0;
    int prize3GetTimes = 0;
    int prize4GetTimes = 0;
    int prize5GetTimes = 0;
    Arithmetic arithmetic = new Arithmetic();
    int times = 1000;
    for (int i = 0; i < times; i++) {
      int prizeId = arithmetic.pay(prizes);
      switch (prizeId) {
        case 1:
          prize1GetTimes++;
          break;
        case 2:
          prize2GetTimes++;
          break;
        case 3:
          prize3GetTimes++;
          break;
        case 4:
          prize4GetTimes++;
          break;
        case 5:
          prize5GetTimes++;
          break;
      }
    }
    System.out.println("抽獎(jiǎng)次數(shù)" + times);
    System.out.println("prize1中獎(jiǎng)次數(shù)" + prize1GetTimes);
    System.out.println("prize2中獎(jiǎng)次數(shù)" + prize2GetTimes);
    System.out.println("prize3中獎(jiǎng)次數(shù)" + prize3GetTimes);
    System.out.println("prize4中獎(jiǎng)次數(shù)" + prize4GetTimes);
    System.out.println("prize5中獎(jiǎng)次數(shù)" + prize5GetTimes);
  }
}

結(jié)果:

 

通過(guò)1000次抽取,我們看出算法精度還是很高的。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 如何基于springcloud模擬RPC調(diào)用(Feign)

    如何基于springcloud模擬RPC調(diào)用(Feign)

    這篇文章主要介紹了如何基于springcloud模擬RPC調(diào)用(Feign),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • spring4新特性之web開(kāi)發(fā)增強(qiáng)

    spring4新特性之web開(kāi)發(fā)增強(qiáng)

    這篇文章主要介紹了spring4新特性之web開(kāi)發(fā)增強(qiáng)的相關(guān)資料,需要的朋友可以參考下
    2017-09-09
  • springboot配置flyway(入門級(jí)別教程)

    springboot配置flyway(入門級(jí)別教程)

    本文介紹了springboot配置flyway,主要介紹基于SpringBoot集成flyway來(lái)管理數(shù)據(jù)庫(kù)的變更,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • 深入聊一聊JDK中的Map和Set

    深入聊一聊JDK中的Map和Set

    這篇文章主要給大家介紹了關(guān)于JDK中Map和Set的相關(guān)資料,文中通過(guò)示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用jdk具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-12-12
  • SpringBoot3+graalvm:整合并打包為可執(zhí)行文件方式

    SpringBoot3+graalvm:整合并打包為可執(zhí)行文件方式

    本文介紹了如何在Spring Boot 3中整合GraalVM,并將其打包為可執(zhí)行文件,適用于Windows和Linux系統(tǒng),通過(guò)安裝GraalVM、配置環(huán)境變量、下載Visual Studio組件(僅限Windows)以及使用Maven容器(適用于Linux),可以實(shí)現(xiàn)高效的打包和運(yùn)行
    2024-12-12
  • 最新評(píng)論

    方山县| 新民市| 天气| 建阳市| 龙门县| 朝阳县| 桂阳县| 长武县| 新宾| 福建省| 岳阳市| 韩城市| 津市市| 葫芦岛市| 准格尔旗| 扎鲁特旗| 囊谦县| 沧州市| 阳高县| 衡水市| 遵化市| 富平县| 开化县| 崇礼县| 谷城县| 句容市| 冀州市| 大英县| 开封市| 太仆寺旗| 于田县| 炎陵县| 长宁区| 象州县| 台州市| 衡阳市| 墨竹工卡县| 商洛市| 济南市| 和平县| 上思县|