至于角度,布吉岛了
import java.util.HashMapimport java.util.Map
import java.util.Random
public class Test {
// 实现思路:给每如州个key设置一个权重,权重越大被取到的概率越大,
// 然后根据权重生成一个连续的大的数据区间,权重越大占用的区间长度越大,
// 在这个连续的大区间中取随机数,取到的数落在哪个区间就取出该区间
// 对应的key,从而实现了根据权重控制key获取的概率
public static final Map<int[], String> INTERVAL = new HashMap<>()
public static int limit = 0
static {
// 权重,表示配碧被选中的机会大小
Map<String, Integer> WEIGHT = new HashMap<>()
WEIGHT.put("a", 1)
WEIGHT.put("b", 5)
渣卖蔽 WEIGHT.put("c", 10)
WEIGHT.put("d", 20)
for (Map.Entry<String, Integer> entry : WEIGHT.entrySet()) {
String key = entry.getKey()
int value = entry.getValue()
INTERVAL.put(new int[]{limit, limit + value}, key)
limit += value
}
}
// 随机获取一个key
public static String getRandomKey() {
// 获取一个指定范围内的随机数
int ran = new Random().nextInt(limit)
for (Map.Entry<int[], String> entry : INTERVAL.entrySet()) {
int[] key = entry.getKey()
String value = entry.getValue()
if (ran >= key[0] && ran < key[1]) {
return value
}
}
return null
}
public static void main(String[] args) {
// 随机取WEIGHT中的key,统计每个key被取到的次数
Map<String, Integer> count = new HashMap<>()
for (int i = 0 i < 1000000 i++) {
String k = getRandomKey()
if (count.containsKey(k)) {
count.put(k, count.get(k) + 1)
} else {
count.put(k, 1)
}
}
// 执行结果可以看出每个key取到的次数和设置的权重所占比例比较接近,
// 取得次数越多比例越精确
for (Map.Entry<String, Integer> entry : count.entrySet()) {
String key = entry.getKey()
Integer value = entry.getValue()
System.out.println(key + ":" + value)
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)