Java根据权重按比例返回相应的值
根据权重等比例返回相应的值,有很多种实现方式和途径。这里简单演示两种Java的程序实现,先贴代码:
public static void main(String[] args) throws ParseException {
Map<String, Integer> map = new HashMap<>();
map.put("A", 20);
map.put("B", 10);
map.put("C", 40);
map.put("D", 30);
//获取权重总和
Integer sum = map.values().parallelStream().reduce(Integer::sum).get();
//测试500W次
Integer total = 5000000;
//第一种方式
int a = 0, b = 0, c = 0, d = 0;
for (int i = 0; i < total; i++) {
Integer random = new Random().nextInt(sum);
for (String str : map.keySet()) {
int weight = map.get(str);
if (random > weight) {
random -= weight;
} else {
switch (str) {
case "A":
a++;
break;
case "B":
b++;
break;
case "C":
c++;
break;
case "D":
d++;
break;
}
break;
}
}
}
System.out.println("第一种方式:");
System.out.println("A:" + a + " 占比:" + ((float) a / total));
System.out.println("B:" + b + " 占比:" + ((float) b / total));
System.out.println("C:" + c + " 占比:" + ((float) c / total));
System.out.println("D:" + d + " 占比:" + ((float) d / total));
//第二种方式
List<String> list = new ArrayList<>();
map.keySet().forEach(key -> {
int value = map.get(key);
for (int i = 0; i < value; i++) {
list.add(key);
}
});
Collections.shuffle(list);
int A = 0, B = 0, C = 0, D = 0;
for (int i = 0; i < total; i++) {
String str = list.get(new Random().nextInt(sum));
switch (str) {
case "A":
A++;
break;
case "B":
B++;
break;
case "C":
C++;
break;
case "D":
D++;
break;
}
}
System.out.println("\n第二种方式:");
System.out.println("A:" + A + " 占比:" + ((float) A / total));
System.out.println("B:" + B + " 占比:" + ((float) B / total));
System.out.println("C:" + C + " 占比:" + ((float) C / total));
System.out.println("D:" + D + " 占比:" + ((float) D / total));
}
实验结果:
根据结果可以看出,两种方式都能满足要求。但相对而言,第一种方式更能省内存。
还没有评论,来说两句吧...