2015-06-20 200 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)); 
    } 
}