实现随机数按概率显示 java版
2013-07-25 18:58
281 查看
这个方法是网上找的最简洁的方法了。实现的也比较好。
一个常见的场景,在游戏中打一个怪物,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实现:
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;
}
}
测试(次数足够多时,各值出现的比例跟概率是基本一致的):
Java代码
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
一个常见的场景,在游戏中打一个怪物,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实现:
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;
}
}
测试(次数足够多时,各值出现的比例跟概率是基本一致的):
Java代码
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);
}
}
for (String key : count.keySet()) {
System.out.println(key + ":" + count.get(key));
}
}
}
参考:http://blogread.cn/it/article.php?id=4102
相关文章推荐
- java代码--实现随机输出10个随机数,并显示最大值,最小值
- Java 随机数、概率实现——Random类
- Java 工程的外部依赖显示工具实现及使用
- 算法--生成m个指定范围的不重复随机数的三种方法分析(Java实现)
- 随机数的扩展--等概率随机函数的实现
- Java实现时间动态显示方法汇总
- [java多线程]-显示锁的实现
- 华为机试(字符串最后一个单词长度,计算字符串的个数,明明的随机数) Java实现
- Swing实现Java代码编辑器实现关键词高亮显示
- Java实现按照概率产生
- java利用map来实现可视化统计随机数分布
- java中swing实现TextArea显示内容满时自动滚动到末尾
- Java生成10个1000以内的随机数并用消息框显示数组内容然后求和输出
- java 实现系统目录树 ,树控件使用,显示 系统文件夹
- 实现在调用jar包中的java方法时显示方法注释
- JAVA 根据设置的概率生成随机数
- 算法java实现--概率算法--随机数
- java实现的统计随机数次数
- 用递归算法实现斐波那契数列显示(Java)
- JAVA实现多用户接收服务器发送相同信息并显示各自屏幕上