您当前的位置:首页 > 互联网教程

java集五福活动概率技术如何实现

发布时间:2025-05-20 08:32:37    发布人:远客网络

java集五福活动概率技术如何实现

一、java集五福活动概率技术如何实现

*概率为百分数去掉百分号的部分,如10%,则为10

*1.输入抽奖概率集合,【抽奖概率集合为{10.0,20.0,30.0}】

*2.生成连续集合,【生成的连续集合为{(0.0,10.0],(10.0,30.0],(30.0,60.0]}】

*3.生成随机数,【生成方法为random.nextDouble()*maxElement】

*4.判断随机数在哪个区间内,返回该区间的index【生成了随机数12.001,则它属于(10.0,30.0],返回index=1】

*集合中元素x满足:(minElement,maxElement]

*数学表达式为:minElement<x<=maxElement

publicContinuousList(doubleminElement,doublemaxElement){

thrownewIllegalArgumentException("区间不合理,minElement不能大于maxElement!");

publicbooleanisContainKey(doubleelement){

if(element>minElement&&element<=maxElement){

privateList<ContinuousList>lotteryList;//概率连续集合

privatedoublemaxElement;//这里只需要最大值,最小值默认为0.0

publicLotteryUtil(List<Double>list){

lotteryList=newArrayList<ContinuousList>();

thrownewIllegalArgumentException("抽奖集合不能为空!");

ContinuousListcontinuousList=null;

continuousList=newContinuousList(minElement,maxElement);

lotteryList.add(continuousList);

*返回:奖品的概率list集合中的下标

doubled=r.nextDouble()*maxElement;//生成0-1间的随机数

d=r.nextDouble()*maxElement;//防止生成0.0

ContinuousListcl=lotteryList.get(i);

thrownewIllegalArgumentException("概率集合设置不合理!");

publicList<ContinuousList>getLotteryList(){

publicvoidsetLotteryList(List<ContinuousList>lotteryList){

该工具类的基本思想是,将抽奖概率分布到数轴上,如现有三个抽奖概率10、20、30,将三者依次添加到概率集合中,则构造的数轴为:0~10范围内表示概率10,10~30范围内表示概率为20,30~60范围内表示概率为30,数轴上的长度对应着相应的概率。由这种处理方式可知,概率总和并不需要等于1。该工具类的成功与否在于Random.nextDouble()能否等概率地生成0~1之间的任意一个数。

对该抽奖工具进行测试,测试类如下:

publicvoidsetSumTime(intsumTime){

publicdoublegetRealProbability(){

publicvoidsetRealProbability(doublerealProbability){

this.realProbability=realProbability;

publicResult(intindex,intsumTime,inttime,doublerealProbability){

this.setRealProbability(realProbability);

return"索引值:"+index+",抽奖总数:"+sumTime+",抽中次数:"+time+",概率:"

+realProbability+",实际概率:"+(double)time/sumTime;

publicstaticvoiditeratorMap(Map<Integer,Integer>map,List<Double>list){

for(Entry<Integer,Integer>entry:map.entrySet()){

Resultresult=newResult(index,TIME,time,list.get(index));

publicstaticvoidmain(String[]args){

List<Double>list=newArrayList<Double>();

LotteryUtilll=newLotteryUtil(list);

doublesumProbability=ll.getMaxElement();

Map<Integer,Integer>map=newHashMap<Integer,Integer>();

intindex=ll.randomColunmIndex();

map.put(index,map.get(index)+1);

for(inti=0;i<list.size();i++){

doubleprobability=list.get(i)/sumProbability;

由结果可知,抽奖100000时,得到的实际概率基本与正式概率相当。

publicLotteryUtil(List<Double>list)

说明:构造方法,传入参数为一个概率集合

功能:进行抽奖操作,返回List集合的索引下标,此下标对应的概率的奖品即为抽中的奖品

二、java :变红概率为0.015

承接上一个问题,已经解决了JPanel圆圈的绘制和颜色的改变了

概率设置问题,也可以用随即数产生

比如0.015可以看成是15/1000.比如 [0,14]闭区间一共有15个数字.只要随即产生的数字是[0,14]间,就可以认为满足条件.

也就是说随即数字范围在[0,1000)的左闭右开区间内,只要小于15就可以改变颜色为红色

//产生1个集合,里面有1和0两种元素,共计10个

privateArrayList<Integer>getList(){

if(r.nextInt(1000)<15){//0.015就是15/1000[0~14]共15个数字,在此区间的概率就是0.015

三、java数据结构

1、首先明确,带权路径长度WPL最小的二叉树称作最优二叉树或哈夫曼树

2、那么比如说有4个节点,分别带权7,5,2,4如下ab两图

3、可以看到,出现概率越小的越应该放在下面(也就是说被遍历的概率小就可以代价大一点,而容易便利到的一定要减少开销)

4、其实是有一套算法的...从底往上,找最小的两个节点做和,做和得到的新结点和未被计算的节点重复“最小两节点做和”操作最终结果:

5、WPL=30*2+5*5*4+8*4*15*3+15*2+27*2=

6、不算了口算不行...看上式也知道你出现的概率越大,相当于基地越大,就给你乘个小的代价,必然是最优的。