Java 增加机会
我有6个玩家,每个玩家都有一个叫做因果报应的领域。它可以从-1000到1000。如果玩家的业力为0,他们的几率是正常的,很可能是1000。这是我目前挑选一名特殊球员的方法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
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根据有趣的业力值计算(相对)概率,至少可以得到一个新答案的一部分,但如果人们认为这是边际的,我愿意删除我的答案。