根據權重等比例返回相應的值,有很多種實現方式和途徑。這裏簡單演示兩種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));
}
實驗結果:
根據結果可以看出,兩種方式都能滿足要求。但相對而言,第一種方式更能省內存。