最近要做一个手机app的插屏广告,本人这里要做的事情很简单,就是做一个后台,可以上传包和图片,这些都做完了,但是最难的一个问题就是–修改图片显示的概率,也就是插屏广告里边的图片是随机显示的,但是也有一个概率,例如本人a图片的收入多,那本人就在后台把a的显示几率调大一些。这样。需求就是这样,原因是以前没做过这种,而且图片数量是动态的,传到本人的servlet里边,本人也不清楚怎么通过计算,最后返回的是一张图片。本人在main()里边写了个网上看到的例子,但是本人不知道该怎么把它改成动态的…..
public static void main(String[] args) {
// TODO Auto-generated method stub
//属性1,2,3
String st1=”一”;
String st2=”二”;
String st3=”三”;
//概率1,2,3
double do1=0.5;
double do2=0.3;
double do3=0.2;
double randomNum = Math.random();
if(randomNum >=do1+do2 && randomNum <= do1+do2+do3 ){
System.out.println(st3);
}else if(randomNum >= do1+do3 && randomNum <= do1+do2+do3){
System.out.println(st2);
}else if(randomNum >= do2+do3 && randomNum <=do1+do2+do3){
System.out.println(st1);
}else{
System.out.println(0);
}
}
这个只要改一下那个概率的顺序就完全不行了。求指点,或本人这个办法本来就不行。希望有人可以指点一下帮忙解决啊!
public static void main(String[] args) {
// TODO Auto-generated method stub
//属性1,2,3
String st1=”一”;
String st2=”二”;
String st3=”三”;
//概率1,2,3
double do1=0.5;
double do2=0.3;
double do3=0.2;
double randomNum = Math.random();
if(randomNum >=do1+do2 && randomNum <= do1+do2+do3 ){
System.out.println(st3);
}else if(randomNum >= do1+do3 && randomNum <= do1+do2+do3){
System.out.println(st2);
}else if(randomNum >= do2+do3 && randomNum <=do1+do2+do3){
System.out.println(st1);
}else{
System.out.println(0);
}
}
这个只要改一下那个概率的顺序就完全不行了。求指点,或本人这个办法本来就不行。希望有人可以指点一下帮忙解决啊!
解决方案:10分
随机一个(1-100)的数除以100得到的数再通过sql查询(比(1-100)/100这个比例大的)升序列出返回第一个就是你要的
解决方案:10分
private static void test() { // map 记录每个图片的概率 Map<String, Float> map = new HashMap<String, Float>(); // a,b,c的概率和也可以不为1,它对自动把概率值当比例值去运行。 map.put("a", 0.3f); map.put("b", 0.2f); map.put("c", 0.1f); // 返回的s就是按照上面的概率参数的。 String s = probability(map); System.out.println(s); } /** * 按照概率集合参数随机对象 * @param map * @return */ private static String probability(Map<String, Float> map) { Float total = 0f; Map<Float, String> tempMap = new LinkedHashMap<Float, String>(); // 使用有序的map集合以保证key值是递增的 Iterator<Entry<String, Float>> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, Float> entry = (Map.Entry<String, Float>) it.next(); total += entry.getValue(); tempMap.put(total, entry.getKey()); } float index = new Random().nextFloat()*total; Iterator<Entry<Float, String>> tempIt = tempMap.entrySet().iterator(); while (tempIt.hasNext()) { Entry<Float, String> next = tempIt.next(); if (index < next.getKey()) { return next.getValue(); } } return null; }
解决方案:7分
总体思路就是给整个事件分段,a/b/c..按照概率分成不同的段,然后产生一个随机数,该随机数所在的段即为选择到的值。