一个常见的场景,在游戏中打一个怪物,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是Matrix Laboratory(矩阵实验室)的缩写,是一种高性能的数值计算和可视化软件,广泛应用...
在这个场景中,我们讨论的是一个使用ASP.NET技术实现的大转盘应用,其中包含了自定义的概率算法。大转盘通常用于抽奖或游戏活动中,用户点击启动按钮,转盘会随机停在某个奖项上,每个奖项的中奖概率可以通过算法...
在实现中,首先计算出所有个体适应度的总和,然后根据每个个体适应度占总适应度的比例来决定其被选中的概率。 4. 交配过程(子程序jiaopeide):在遗传算法中,交配操作主要是为了产生新的后代。在这个过程中,一般...
"遗传算法的matlab实现" 遗传算法是群体优化算法,也就是从多个初始解开始进行优化,每个解称为一个染色体,各染色体之间通过竞争、合作、单独变异,不断进化。优化时先要将实际问题转换到遗传空间,就是把实际问题...
权重值越大,服务器被选中的概率越高。这样可以确保处理能力强的服务器接收到更多的请求,而处理能力弱的服务器则接收较少的请求,从而达到负载均衡的目的。 2. **工作流程**: - Nginx维护一个包含所有后端服务器...
这一步可以通过简单的随机抽样实现,确保每个数据点被选中的概率相等。 2. 分配阶段:对于剩下的每个数据点,计算它到所有聚类中心的距离,将其分配到最近的聚类中心所在的簇。这里通常使用欧氏距离作为相似度的...
### 蜂群算法(C语言实现)知识点详解 #### 一、蜂群算法简介 蜂群算法(Artificial Bee Colony ...上述代码提供了一个完整的蜂群算法实现框架,通过对各部分功能的理解和调整,可以将其应用于不同类型的优化问题中。
在这个例子中,我们可以按照每个个体的适应度值进行概率性选择,适应度高的个体有更高的概率被选中。 5. **交叉操作**(Crossover):交叉操作模拟了生物的基因重组,将两个父代个体的部分编码交换,生成新的子代...
假设第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#中实现遗传算法,我们需要关注以下几个关键步骤: 1. **编码**:将问题的解空间转换为可遗传...
在这个案例中,提供的文件“www.pudn.com.txt”可能是关于遗传算法实现的详细代码或说明文档,而“用遗传算法解决TSP问题”可能是源代码文件。通过阅读这些文件,你可以深入了解如何在实际编程中应用遗传算法解决...
在压缩包文件"lottery"中,很可能包含了具体的摇号算法实现代码,这可能是用Python、Java或其他编程语言编写的。通过查看源代码,我们可以了解到更详细的实现细节,比如使用的伪随机数生成器、如何处理权重、如何...
二、MATLAB算法实现 MATLAB作为一种强大的数值计算工具,其内置的优化工具箱提供了实现各种优化算法的便利。在这里,我们采用遗传算法来解决背包问题。遗传算法模仿生物进化过程,通过编码、初始化、选择、交叉和...
本资料"基于matlab的遗传算法实现(包含两个例子)"提供了一个学习和实践遗传算法的良好平台。 MATLAB是一种强大的数学计算软件,它提供了丰富的数学函数库和可视化工具,使得编程变得更加直观和高效。在MATLAB中...