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

java實現(xiàn)抽獎概率類

 更新時間:2020年11月26日 11:18:40   作者:fcytxdy  
這篇文章主要為大家詳細介紹了java實現(xiàn)抽獎概率類,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了java實現(xiàn)抽獎概率類的具體代碼,供大家參考,具體內(nèi)容如下

在一些項目需求中,可能會遇到抽獎問題,如提供一系列獎品及獲獎概率,要求根據(jù)概率返回每次抽到的獎品。以下是本人在實際項目中寫的一個抽獎工具類,與大家共同分享:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
 
/**
 * 抽獎工具類,概率和可以不等于1
 * 概率為百分數(shù)去掉百分號的部分,如10%,則為10
 * 抽獎操作如下:
 * 1.輸入抽獎概率集合,【抽獎概率集合為{10.0, 20.0, 30.0}】
 * 2.生成連續(xù)集合,  【生成的連續(xù)集合為{(0.0, 10.0],(10.0, 30.0],(30.0, 60.0]}】
 * 3.生成隨機數(shù),   【生成方法為 random.nextDouble() * maxElement】
 * 4.判斷隨機數(shù)在哪個區(qū)間內(nèi),返回該區(qū)間的index【生成了隨機數(shù)12.001,則它屬于(10.0, 30.0],返回 index = 1】
 * 
 */
public class LotteryUtil {
 
 /**
 * 定義一個連續(xù)集合
 * 集合中元素x滿足:(minElement,maxElement]
 * 數(shù)學表達式為:minElement < x <= maxElement
 *
 */
 public class ContinuousList {
 
 private double minElement;
 private double maxElement;
 
 public ContinuousList(double minElement, double maxElement){
 if(minElement > maxElement){
 throw new IllegalArgumentException("區(qū)間不合理,minElement不能大于maxElement!");
 }
 this.minElement = minElement;
 this.maxElement = maxElement;
 }
 
 /**
 * 判斷當前集合是否包含特定元素
 * @param element
 * @return
 */
 public boolean isContainKey(double element){
 boolean flag = false;
 if(element > minElement && element <= maxElement){
 flag = true;
 }
 return flag;
 }
 
 }
 
 private List<ContinuousList> lotteryList; //概率連續(xù)集合
 private double maxElement;  //這里只需要最大值,最小值默認為0.0
 
 /**
 * 構(gòu)造抽獎集合
 * @param list 為獎品的概率
 */
 public LotteryUtil(List<Double> list){
 lotteryList = new ArrayList<ContinuousList>();
 if(list.size() == 0){
 throw new IllegalArgumentException("抽獎集合不能為空!");
 }
 double minElement = 0d;
 ContinuousList continuousList = null;
 for(Double d : list){
 minElement = maxElement;
 maxElement = maxElement + d;
 continuousList = new ContinuousList(minElement, maxElement);
 lotteryList.add(continuousList);
 }
 }
 
 /**
 * 進行抽獎操作
 * 返回:獎品的概率list集合中的下標
 */
 public int randomColunmIndex(){
 int index = -1;
 Random r = new Random();
 double d = r.nextDouble() * maxElement; //生成0-1間的隨機數(shù)
 if(d == 0d){
 d = r.nextDouble() * maxElement;  //防止生成0.0
 }
 int size = lotteryList.size();
 for(int i = 0; i < size; i++){
 ContinuousList cl = lotteryList.get(i);
 if(cl.isContainKey(d)){
 index = i;
 break;
 }
 }
 if(index == -1){
 throw new IllegalArgumentException("概率集合設(shè)置不合理!");
 }
 return index;
 
 }
 
 public double getMaxElement() {
 return maxElement;
 }
 
 public List<ContinuousList> getLotteryList() {
 return lotteryList;
 }
 public void setLotteryList(List<ContinuousList> lotteryList) {
 this.lotteryList = lotteryList;
 }
 
 
}

該工具類的基本思想是,將抽獎概率分布到數(shù)軸上,如現(xiàn)有三個抽獎概率10、20、30,將三者依次添加到概率集合中,則構(gòu)造的數(shù)軸為:0~10范圍內(nèi)表示概率10,10~30范圍內(nèi)表示概率為20,30~60范圍內(nèi)表示概率為30,數(shù)軸上的長度對應著相應的概率。由這種處理方式可知,概率總和并不需要等于1。該工具類的成功與否在于Random.nextDouble()能否等概率地生成0~1之間的任意一個數(shù)。

對該抽獎工具進行測試,測試類如下:

package com.lottery;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
 
class Result{
 private int index;
 private int sumTime;
 private int time;
 private double probability;
 private double realProbability;
 
 public int getIndex() {
 return index;
 }
 
 public void setIndex(int index) {
 this.index = index;
 }
 
 public int getTime() {
 return time;
 }
 
 public void setTime(int time) {
 this.time = time;
 }
 
 public int getSumTime() {
 return sumTime;
 }
 
 public void setSumTime(int sumTime) {
 this.sumTime = sumTime;
 }
 
 public double getProbability() {
 return probability;
 }
 
 public double getRealProbability() {
 return realProbability;
 }
 
 public void setRealProbability(double realProbability) {
 this.realProbability = realProbability;
 }
 
 public Result(){
 
 }
 
 public Result(int index, int sumTime, int time, double realProbability) {
 this.setIndex(index);
 this.setTime(time);
 this.setSumTime(sumTime);
 this.setRealProbability(realProbability);
 
 }
 
 public String toString(){
 return "索引值:" + index + ",抽獎總數(shù):" + sumTime + ",抽中次數(shù):" + time + ",概率:" 
   + realProbability + ",實際概率:" + (double)time/sumTime;
 }
}
 
public class TestLottery {
 
 static final int TIME = 100000;
 
 public static void iteratorMap(Map<Integer, Integer> map, List<Double> list){
 for(Entry<Integer, Integer> entry : map.entrySet()){
 int index = entry.getKey();
 int time = entry.getValue();
 Result result = new Result(index, TIME, time, list.get(index));
 System.out.println(result);
 }
 }
 
 public static void main(String[] args) {
 //構(gòu)造概率集合
 List<Double> list = new ArrayList<Double>();
 list.add(20d);
 list.add(80d);
 list.add(50d);
 list.add(30d);
 LotteryUtil ll = new LotteryUtil(list);
 double sumProbability = ll.getMaxElement();
 
 Map<Integer, Integer> map = new HashMap<Integer, Integer>();
 for(int i = 0; i < TIME; i++){
 int index = ll.randomColunmIndex();
 if(map.containsKey(index)){
 map.put(index, map.get(index) + 1);
 }else{
 map.put(index, 1);
 }
 }
 for(int i = 0; i < list.size(); i++){
 double probability = list.get(i) / sumProbability;
 list.set(i, probability);
 }
 iteratorMap(map, list);
 
 }

}

運行結(jié)果:

由結(jié)果可知,抽獎100000時, 得到的實際概率基本與正式概率相當。

以下說明此類調(diào)用方式:

public LotteryUtil(List<Double> list)
說明:構(gòu)造方法,傳入?yún)?shù)為一個概率集合

public int randomColunmIndex()
功能:進行抽獎操作,返回List集合的索引下標,此下標對應的概率的獎品即為抽中的獎品

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Java設(shè)計模式編程中的中介者模式

    詳解Java設(shè)計模式編程中的中介者模式

    這篇文章主要介紹了Java設(shè)計模式編程中的中介者模式,文中舉了典型的同事類與中介者類的例子來解釋說明,需要的朋友可以參考下
    2016-02-02
  • java反射的作用知識點總結(jié)

    java反射的作用知識點總結(jié)

    在本篇文章里小編給大家整理的是關(guān)于java反射的作用知識點總結(jié),需要的朋友們可以學習下。
    2020-02-02
  • java中的文件操作總結(jié)(干貨)

    java中的文件操作總結(jié)(干貨)

    本篇文章主要介紹了java中的文件操作總結(jié)(干貨),主要有文件讀寫,遍歷文件夾,文件夾操作等,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • 關(guān)于SpringBoot的自動裝配原理詳解

    關(guān)于SpringBoot的自動裝配原理詳解

    這篇文章主要介紹了關(guān)于SpringBoot的自動裝配原理詳解,Spring?Boot自動裝配原理是指Spring?Boot在啟動時自動掃描項目中的依賴關(guān)系,根據(jù)依賴關(guān)系自動配置相應的Bean,從而簡化了Spring應用的配置過程,需要的朋友可以參考下
    2023-07-07
  • spring boot與spring mvc的區(qū)別及功能介紹

    spring boot與spring mvc的區(qū)別及功能介紹

    這篇文章主要介紹了spring boot與spring mvc的區(qū)別是什么以及spring boot和spring mvc功能介紹,感興趣的朋友一起看看吧
    2018-02-02
  • SpringCloud應用骨架開發(fā)詳解

    SpringCloud應用骨架開發(fā)詳解

    這篇文章主要介紹了SpringCloud應用骨架開發(fā)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Java Socket實現(xiàn)聊天室附1500行源代碼

    Java Socket實現(xiàn)聊天室附1500行源代碼

    Socket是應用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口。本篇文章手把手帶你通過Java Socket來實現(xiàn)自己的聊天室,大家可以在過程中查缺補漏,溫故而知新
    2021-10-10
  • Spring事務相關(guān)問題解決方案

    Spring事務相關(guān)問題解決方案

    這篇文章主要介紹了Spring事務相關(guān)問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Java 實現(xiàn)文件批量重命名親測可用(精簡版)

    Java 實現(xiàn)文件批量重命名親測可用(精簡版)

    本文給大家分享一段自己寫的java代碼實現(xiàn)文件批量重命名,親測試過沒有任何問題,大家可以放心使用
    2016-11-11
  • 詳解如何在Elasticsearch中搜索空值

    詳解如何在Elasticsearch中搜索空值

    這篇文章主要為大家介紹了如何在Elasticsearch中搜索空值的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01

最新評論

安塞县| 龙山县| 康平县| 南华县| 靖边县| 高州市| 遂昌县| 铜山县| 江永县| 白水县| 余江县| 阳城县| 洛扎县| 山西省| 台东市| 偃师市| 台安县| 汶川县| 兰州市| 内丘县| 东乌珠穆沁旗| 沙河市| 兰考县| 五莲县| 卓尼县| 阜阳市| 瑞安市| 广汉市| 社旗县| 南平市| 广水市| 略阳县| 吉首市| 法库县| 清涧县| 禄丰县| 徐汇区| 西宁市| 灌云县| 蓬溪县| 南投市|