Java 增加机会

Java 增加机会,java,random,arraylist,Java,Random,Arraylist,我有6个玩家,每个玩家都有一个叫做因果报应的领域。它可以从-1000到1000。如果玩家的业力为0,他们的几率是正常的,很可能是1000。这是我目前挑选一名特殊球员的方法 List<String> players = new ArrayList<String>(); for (Player p : getOnlinePlayers() { players.add(p.getName()); } Player p = getPlayer(players.get(ne

我有6个玩家,每个玩家都有一个叫做因果报应的领域。它可以从-1000到1000。如果玩家的业力为0,他们的几率是正常的,很可能是1000。这是我目前挑选一名特殊球员的方法

List<String> players = new ArrayList<String>();
for (Player p : getOnlinePlayers() {
    players.add(p.getName());
}
Player p = getPlayer(players.get(new Random().nextInt(players
        .size())));
while (sherrifs.contains(p.getName())) {
    p = Bukkit.getPlayer(players.get(new Random().nextInt(players
            .size())));
}
special = p;
List players=new ArrayList();
对于(玩家p:GetOnlinePlayer(){
players.add(p.getName());
}
Player p=getPlayer(players.get(new Random().nextInt(players
.size());
while(sherrifs.contains(p.getName())){
p=Bukkit.getPlayer(players.get(new Random().nextInt)(players
.size());
}
特殊=p;

这目前还不包括业力,但我正在考虑为每个玩家的业力增加1次,但如果所有6个玩家都有1000个业力,这将是非常低效的,这意味着,每个名字被输入1000次。此外,这对-1000个业力不起作用,因为名字必须至少输入一次。我如何增加和减少根据玩家的业力来减少玩家被选中的几率?

看一看。这应该很有帮助。如果你采用Usman Ismali的方法,我建议你为每个玩家添加1001个业力(仅当选择随机玩家时)。否则,业力为-980的玩家不可能被选中。例如:

class Player {
    int prob;
}

class RandomPlayer {
    List<Player> players;

    RandomPlayer(List<Player> players) {
        this.players = players;
    }

    public Player getPlayer() {
        int sum = 0;

        for (Player p : players)
            sum += p.prob + 1001;

        int random = new Random().nextInt(sum);

        int i = 0;
        int sum2 = 0;

        while(sum2 < index) 
             sum2 = sum2 + players.get(i++).prob;

        return players.get(Math.max(0,i-1));
    }
}
职业玩家{
int-prob;
}
类随机游戏者{
列出参与者名单;
随机玩家(列出玩家){
这个。玩家=玩家;
}
公共播放器getPlayer(){
整数和=0;
对于(玩家p:玩家)
总和+=p.prob+1001;
int random=new random().nextInt(总和);
int i=0;
int-sum2=0;
while(sum2
创建一个
列表
,其中的数字是通过添加相对机会计算出来的。选择一名球员是通过确定球员的间隔或“份额”来完成的

// code for creating the list
private List<Player> players = ...;
private List<Double> chances = new ArrayList<>();
private double acc;

public void createChances(){
    acc = 0.0;
    for( Player player: players ){
        acc += (player.getKarma() + 1001)/2000.0;
        chances.add( acc );
    }
}

// code for using the list
private Random random = new Random();

// pick a player
public Player pick(){
    Player picked;
    double rc = random.nextDouble()*acc;
    for( int ic = 0; ic < chances.size(); ++ic ){
        if( rc < chance.get(ic) ){
            picked = players.get(ic);
            break;
        }
    return picked;
}
//创建列表的代码
私人名单玩家=。。。;
private List=new ArrayList();
私人双acc;
公共图书馆{
acc=0.0;
用于(玩家:玩家){
acc+=(player.getKarma()+1001)/2000.0;
添加(acc);
}
}
//使用列表的代码
私有随机=新随机();
//挑选一名球员
公共玩家选择(){
玩家选择;
double rc=random.nextDouble()*acc;
对于(int ic=0;ic
你的问题是什么?我如何才能有效地做到这一点?做什么?你能简洁地表达你的问题吗?我如何根据玩家的业力增加和减少被选中的几率?如果所有玩家都有-1000?均等的机会,好像他们都有0?或1000?我认为c根据有趣的业力值计算(相对)概率,至少可以得到一个新答案的一部分,但如果人们认为这是边际的,我愿意删除我的答案。