private Map<String,Integer> serverMap = new HashMap<String,Integer>(){{ put("192.168.1.100",1); put("192.168.1.101",1); put("192.168.1.102",4); put("192.168.1.103",1); put("192.168.1.104",1); put("192.168.1.105",3); put("192.168.1.106",1); put("192.168.1.107",2); put("192.168.1.108",1); put("192.168.1.109",1); put("192.168.1.110",1); }}; private List<String> servers = new ArrayList<>(serverMap.keySet());
public void weightRandom(){ Set<String> keySet = serverMap.keySet(); List<String> servers = new ArrayList<String>(); for(Iterator<String> it = keySet.iterator();it.hasNext();){ String server = it.next(); int weight = serverMap.get(server); for(int i=0;i<weight;i++){ servers.add(server); } } String server = null; Random random = new Random(); int idx = random.nextInt(servers.size()); server = servers.get(idx); System.out.println(server); }
public String randomWeight(){ int length = serverMap.size(); // 总个数 int totalWeight = 0; // 总权重 boolean sameWeight = true; // 权重是否都同样 for (int i = 0; i < length; i++) { int weight = serverMap.get(servers.get(i)); totalWeight += weight; // 累计总权重 if (sameWeight && i > 0 && weight != serverMap.get(servers.get(i-1))) { sameWeight = false; // 计算全部权重是否同样 } } if (totalWeight > 0 && ! sameWeight) { // 若是权重不相同且权重大于0则按总权重数随机 int offset = ThreadLocalRandom.current().nextInt(totalWeight); // 并肯定随机值落在哪一个片段上 for (int i = 0; i < length; i++) { offset -= serverMap.get(servers.get(i)); if (offset < 0) { return servers.get(i); } } } // 若是权重相同或权重为0则均等随机 return servers.get(ThreadLocalRandom.current().nextInt(length)); }
想获取最新内容,请关注微信公众号git