`
flysnowxf
  • 浏览: 577821 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

概率选中的算法实现

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

再举多个候选数的例子。比如a概率为20%,b概率为30%,c概率为40%,d概率为10%,那么他们的概率值范围分别是:
a[1,20]
b[21,50]
c[51,90]
d[91,100]
然后取一个[1,100]的随机数,落到谁的范围谁就是选中了。

算法描述如下:
1.依次(顺序可随机)将各项按概率值从原点开始放在一维坐标上首尾相连,这样每一项对应一个取值区间
2.在总区间范围内随机选取一个点,落在哪一项对应的区间就选中哪一项

java实现:
public class RandomEngine {
     /**
     * 概率选择
     * @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;
     }
}

测试(次数足够多时,各值出现的比例跟概率是基本一致的):
public class RandomEngineTest {
     public static void main(String[] args) {
          Map<String, Integer> keyChanceMap = new HashMap<String, Integer>();
          keyChanceMap.put("a", 30);
          keyChanceMap.put("b", 10);
          keyChanceMap.put("c", 40);
          keyChanceMap.put("d", 20);
          
          Map<String, Integer> count = new HashMap<String, Integer>();
          for (int i = 0; i < 100000; i++) {
               String key = RandomEngine.chanceSelect(keyChanceMap);
               if(count.containsKey(key)) {
                    count.put(key, count.get(key) + 1);
               }
               else {
                    count.put(key, 1);
               }
          }
          
          // print
          for (String key : count.keySet()) {
               System.out.println(key + ":" + count.get(key));
          }
     }
}

参考:http://blogread.cn/it/article.php?id=4102
分享到:
评论

相关推荐

    概率算法及其实现

    概率算法及其实现 概率算法是一种常用的数值方法,用于计算复杂的数学问题。通过随机数生成和统计方法,可以近似计算积分、概率分布和其他数学对象。本文将详细讲解概率算法的原理、分类和实现方法,并给出多个实例...

    基于matlab遗传算法实现

    《基于Matlab的遗传算法实现》是一篇详细探讨如何利用Matlab编程环境来设计和实现遗传算法的参考资料。遗传算法是一种模拟自然选择和遗传过程的优化技术,它在解决复杂问题,如组合优化、参数估计和模式识别等领域,...

    遗传算法实现公交车调度MATLAB

    通过遗传算法实现公交车调度,不仅可以解决现实世界的问题,还能帮助学习和理解人工智能和优化理论。在MATLAB中实现这样的项目,不仅能锻炼编程技能,还能加深对遗传算法原理的理解。在完成这个课程设计后,你可以...

    基于MATLAB的遗传算法实现

    基于MATLAB的遗传算法实现涉及到编程技巧、遗传算法原理以及MATLAB软件的使用。 首先,需要了解MATLAB的基本概念。MATLAB是Matrix Laboratory(矩阵实验室)的缩写,是一种高性能的数值计算和可视化软件,广泛应用...

    asp.net做的大转盘,自己写的概率算法

    在这个场景中,我们讨论的是一个使用ASP.NET技术实现的大转盘应用,其中包含了自定义的概率算法。大转盘通常用于抽奖或游戏活动中,用户点击启动按钮,转盘会随机停在某个奖项上,每个奖项的中奖概率可以通过算法...

    简单遗传算法的fortran实现.pdf

    在实现中,首先计算出所有个体适应度的总和,然后根据每个个体适应度占总适应度的比例来决定其被选中的概率。 4. 交配过程(子程序jiaopeide):在遗传算法中,交配操作主要是为了产生新的后代。在这个过程中,一般...

    遗传算法的matlab实现

    "遗传算法的matlab实现" 遗传算法是群体优化算法,也就是从多个初始解开始进行优化,每个解称为一个染色体,各染色体之间通过竞争、合作、单独变异,不断进化。优化时先要将实际问题转换到遗传空间,就是把实际问题...

    Ngnix权重选择算法Java实现

    权重值越大,服务器被选中的概率越高。这样可以确保处理能力强的服务器接收到更多的请求,而处理能力弱的服务器则接收较少的请求,从而达到负载均衡的目的。 2. **工作流程**: - Nginx维护一个包含所有后端服务器...

    基于Hadoop的Kmeans算法实现

    这一步可以通过简单的随机抽样实现,确保每个数据点被选中的概率相等。 2. 分配阶段:对于剩下的每个数据点,计算它到所有聚类中心的距离,将其分配到最近的聚类中心所在的簇。这里通常使用欧氏距离作为相似度的...

    蜂群算法(C语言实现)

    ### 蜂群算法(C语言实现)知识点详解 #### 一、蜂群算法简介 蜂群算法(Artificial Bee Colony ...上述代码提供了一个完整的蜂群算法实现框架,通过对各部分功能的理解和调整,可以将其应用于不同类型的优化问题中。

    c语言实现简单的遗传算法GA

    在这个例子中,我们可以按照每个个体的适应度值进行概率性选择,适应度高的个体有更高的概率被选中。 5. **交叉操作**(Crossover):交叉操作模拟了生物的基因重组,将两个父代个体的部分编码交换,生成新的子代...

    java:实现遗传算法

    假设第t代种群P(t)中共有N个染色体xi(1),各染色体的适应值为f(xi),故染色体xi被选中的概率为: P(xi)=f(xi)/sum(f(xj)), j=1,2,...N. (4)交叉算子 Pc:交叉概率;范围在0.4---0.99之间 交叉准则:可以

    遗传算法c#实现,参考,学习

    适应度高的个体有更高的概率被选中参与繁殖,通过交叉和变异操作生成新的种群,如此迭代直到达到预设的停止条件。 在C#中实现遗传算法,我们需要关注以下几个关键步骤: 1. **编码**:将问题的解空间转换为可遗传...

    遗传算法实现旅行商问题

    在这个案例中,提供的文件“www.pudn.com.txt”可能是关于遗传算法实现的详细代码或说明文档,而“用遗传算法解决TSP问题”可能是源代码文件。通过阅读这些文件,你可以深入了解如何在实际编程中应用遗传算法解决...

    摇号算法实现

    在压缩包文件"lottery"中,很可能包含了具体的摇号算法实现代码,这可能是用Python、Java或其他编程语言编写的。通过查看源代码,我们可以了解到更详细的实现细节,比如使用的伪随机数生成器、如何处理权重、如何...

    背包问题.rar_matlab算法实现背包问题_价值背包算法_背包最大价值_背包问题_遗传算法 背包

    二、MATLAB算法实现 MATLAB作为一种强大的数值计算工具,其内置的优化工具箱提供了实现各种优化算法的便利。在这里,我们采用遗传算法来解决背包问题。遗传算法模仿生物进化过程,通过编码、初始化、选择、交叉和...

    基于matlab的遗传算法实现(包含两个例子)

    本资料"基于matlab的遗传算法实现(包含两个例子)"提供了一个学习和实践遗传算法的良好平台。 MATLAB是一种强大的数学计算软件,它提供了丰富的数学函数库和可视化工具,使得编程变得更加直观和高效。在MATLAB中...

Global site tag (gtag.js) - Google Analytics