2015-06-20 2 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. Это должно быть полезно. Если бы вы использовали метод Усмана Исмали, я бы рекомендовал вам добавить 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)); 
    } 
} 
Смежные вопросы