我是靠谱客的博主 甜美往事,最近开发中收集的这篇文章主要介绍随机 概率 选中 算法实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

因为最近项目中要完成,判断一件事情依照指定概率,随机的是否能被抽中?这样就是一个简单的随机算法实现。

说个简单的例子,比如:

一个常见的场景,在游戏中打一个怪物,10%几率出现miss,那么这次攻击是命中还是miss呢?我们可以用随机数来实现,miss的范围是[1,10],命中的范围是[11,100],然后我们取一个随机数,比如60就是命中了,如果不幸取到8就是miss了。只要测试的次数足够多,那么miss的比例将会趋向于10%。

再比如说,很多网站上面的转盘抽奖的例子,比如一个大圆盘,按照面积来划分,10%的区域是一等奖,20%是二等奖,30%是三等奖,40%是未中奖,那么你现在准备转一次,请问,这次我到底该中几等奖还是不中奖?这个过程是用算法怎么实现的?


很简单,利用随机数来实现。

比如a概率为10%,b概率为20%,c概率为30%,d概率为40%,那么他们的概率值范围分别是: 
a[1,10] 
b[11,30] 
c[31,60] 
d[61,100] 
然后取一个[1,100]的随机数,落到谁的范围谁就是选中了。 

这个就是最基本,最简单的过程了,现在看下面的实现:

public class Test {  
     /** 
     * 概率选择 
     * @param keyChanceMap key为唯一标识,value为该标识的概率,是去掉%的数字 
     * @return 被选中的key。未选中返回null 
     */  
     public static String chanceSelect(Map<String, Integer> keyChanceMap) {  
          if(keyChanceMap == null || keyChanceMap.size() == 0)  
               return null;  
            
          Integer sum = 0;  
          for (Integer value : keyChanceMap.values()) {  
               sum += value;  
          }  
          // 从1开始  
          Integer rand = new Random().nextInt(sum) + 1;  
            
          for (Map.Entry<String, Integer> entry : keyChanceMap.entrySet()) {  
               rand -= entry.getValue();  
               // 选中  
               if(rand <= 0) {  
                    return entry.getKey();  
               }  
          }  
            
          return null;  
     }  
}  
当然,你也可以写个测试类,来看看,不过,你会发现,落在每个区间内的数值量刚好和比例是一致的,尤其是在数量比较大的时候,更明显。

在这里用到了hashmap,其实map和数值有点像,都是一个key对一个value,只不过数值下标是固定的0,1,2,3.。。而map比较灵活。感觉这种算法比较有意思。记录一下。

 

最后

以上就是甜美往事为你收集整理的随机 概率 选中 算法实现的全部内容,希望文章能够帮你解决随机 概率 选中 算法实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部