Java 权重随机简单实现例子代码
public class WeightRandomExample{
public static void main(String [] args){
List<DefaultWeightEntity> list = new ArrayList<>();
list.add(new DefaultWeightEntity("A",1));
list.add(new DefaultWeightEntity("B",2));
list.add(new DefaultWeightEntity("C",3));
DefaultWeightEntity defaultEntity = new DefaultWeightEntity("D",94)
list.add(defaultEntity);
WeightRandom<DefaultWeightEntity> weightRandom = new WeightRandom<>(list,defaultEntity);
for(int i=0;i< 30 ;i++){
DefaultWeightEntity entity = weightRandom.randomEntity();
int weight = entity.getWeight();
System.out.println(entity.getName());
}
}
public interface WeightEntity{
public int getWeight();
}
public class WeightRandom<T extends WeightEntity>{
private List<T> content;
private T defaultResult;
public WeightRandom(List<T> content,T defaultResult){
this.content = content;
this.defaultResult = defaultResult;
}
public T randomEntity(){
int totalWeight = content.stream().mapToInt(WeightEntity::getWeight).sum();
int randomNum = ThreadLocalRandom.current().nextInt(totalWeight);
Optional<T> optional = content.stream().filter(t -> {
int result = randomNum - t.getWeight();
return result < 0;
}).findFirst();
return optional.orElse(defaultResult);
}
}
public class DefaultWeightEntity implements WeightEntity{
private String name;
private int weight;
public DefaultWeightEntity(String name, int weight) {
this.name = name;
this.weight = weight;
}
@Override
public int getWeight() {
return this.weight;
}
public String getName() {
return name;
}
}
}