2015-06-20 159 views
-1

我有6名球员,每名球员都有一个名为Karma的球场。它可以从-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; 

目前这不包括因果报应,但我想加入的球员1次,他们各有因缘的,但是这将是真正的低效,如果所有6名选手有1000因缘这意味着,每一个名字是输入了1000次。这也不适用于-1000业力,因为名称必须至少输入一次。我怎样才能增加和减少玩家根据他们的业力被挑选的几率?

+1

你的问题是什么? – Mibac

+0

我将如何能够有效地做到这一点? – InfIV

+0

做什么?你能简洁地说出你的问题吗? – bhspencer

回答

0

创建通过将相对几率计算数字的List<Double>。通过查找玩家的间隔或“分享”来完成玩家选择。

// 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; 
} 
+0

我认为,从有趣的业力值计算一个(相对)概率的需求至少可以保证新答案的一部分,但如果人们认为这是一个很小的问题,我愿意删除我的答案。 – laune

0

看一看here。这应该是有帮助的。如果你想做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)); 
    } 
}