package org.cc.foo_008;

 import java.util.ArrayList;
import java.util.List;
import java.util.Random; public class Main_006 { public static void main(String[] args) { EloRatingSystemDemo e=new EloRatingSystemDemo(); e.show(); // User u=e.gamer.get(new User().level).get(0);
//
// for(int i=0;i<999;i++){
// e.play(u);
// }
//
// e.show();
//
// System.out.println(u.rating); //大部分情况下总能选出一个或少数几个等级比较高的(或比较低的...) 是这个算法比较神奇还是我的程序有问题呢...
for(int i=0;i<99999;i++){
User u=e.randGetUser();
e.play(u);
} e.show(); } } class EloRatingSystemDemo { public List<List<User>> gamer=new ArrayList<>();
//k值越大,升级就越快,绝大部分都处于越高位置
public double k=100; public EloRatingSystemDemo() {
//十个级别
for(int i=0;i<10;i++){
gamer.add(new ArrayList<>());
} //十个玩家
for(int i=0;i<1000;i++){
User u=new User();
gamer.get(u.level).add(u);
}
} //为传入的玩家找到一个对手并开玩一局
public void play(User user){
User river=user;
while(river==user){
river=findRival(user);
}
fightAndRating(user,river);
} //战斗并且评分(Elo Rating System)
public void fightAndRating(User u1,User u2){ //暂时移除
gamer.get(u1.level).remove(u1);
gamer.get(u2.level).remove(u2); //期望得分
double ea=1.0/(1+Math.pow(10,(u1.rating-u2.rating)/400.0));
double eb=1.0/(1+Math.pow(10,(u2.rating-u1.rating)/400.0)); //发生战斗...结果未知
int t=new Random().nextInt(3); double t2=0;
if(t==0){
//A赢
t2=u1.rating+k*(1-ea);
u1.rating=t2>0?t2:0;
t2=u2.rating+k*(0.5-eb);
u2.rating=t2>0?t2:0;
}else if(t==1){
//B赢
t2=u1.rating+k*(0.5-ea);
u1.rating=t2>0?t2:0;
t2=u2.rating+k*(1-eb);
u2.rating=t2>0?t2:0;
}else if(t==2){
//战平
t2=u1.rating+k*(0-ea);;
u1.rating=t2>0?t2:0;
t2=u2.rating+k*(0-eb);
u2.rating=t2>0?t2:0;
} //放入
int level=(int) (u1.rating/500);
level=level<10?level:9;
u1.level=level;
gamer.get(u1.level).add(u1); level=(int) (u2.rating/500);
level=level<10?level:9;
u2.level=level;
gamer.get(u2.level).add(u2); } //找到一个级别相当(左右偏移,实力最接近)的对手
public User findRival(User user){
//如果当前级别只有自己一个人的话就偏移,否则的话说明可以找到同级别的玩家
int shift=gamer.get(user.level).size()==1?1:0;
while(true){ boolean exit=true; //优先匹配弱一些的对手
if(user.level-shift>=0){
User u=findRival0(user.level-shift);
if(u!=null) return u;
exit=false;
}
if(user.level+shift<10){
User u=findRival0(user.level+shift);
if(u!=null) return u;
exit=false;
} if(exit) return null; shift++;
}
} //500分为一个级别,找在某个级别的对手
private User findRival0(int level){
//检测这个级别是否有人
List<User> list=gamer.get(level);
if(list.isEmpty()) return null;
//随机选取一个对手
return list.get(new Random().nextInt(list.size()));
} //随机获得一个用户
public User randGetUser(){
while(true){
List<User> list=gamer.get(new Random().nextInt(gamer.size()));
if(!list.isEmpty()) return list.get(new Random().nextInt(list.size()));
}
} //打印所有玩家的信息:
public void show(){
for(int i=0;i<gamer.size();i++){
List<User> list=gamer.get(i);
System.out.printf("Level %d: ",i+1);
for(int j=0;j<list.size();j++){
System.out.printf("%.2f ",list.get(j).rating);
}
System.out.println();
}
System.out.println();
} } //代表一个玩家,初始分数为1500
class User {
double rating=1500;
int level=(int) (rating/500);
}

Elo rating system 模拟的更多相关文章

  1. 从Elo Rating System谈到层次分析法

    1. Elo Rating System Elo Rating System对于很多人来说比较陌生,根据wikipedia上的解释:Elo评分系统是一种用于计算对抗比赛(例如象棋对弈)中对手双方技能水 ...

  2. Elo rating system(Elo 打分体系)

    A.B 两个待比较.评价的对象,分别打分为 RA,RB,则各自获胜的期望值为: ⎧⎩⎨⎪⎪⎪⎪⎪⎪EA=11+10(RB−RA)/400.EB=11+10(RA−RB)/400. 不妨令 QA=10R ...

  3. Codeforces Rating System

    来翻译一下官方文档,但是建议看英文原文,本文可能会出现一些错误,虽然不是为了方便自己查阅用的. 首先,对于人 \(i\),定义 \(r_i\) 是他的 rating,对于人 \(i,j\),定义 \( ...

  4. Atcoder Rating System

    来翻译一下官方文档,但是建议看英文原文,本文可能会出现一些错误,只是为了方便自己查阅用的. 对于你的每一场rated比赛,会有一个Performance值\(X_i\),你的rating是\(X_i- ...

  5. elo system

    今天了解了一下游戏中的PVP模块的实现,大多数的游戏都使用到了ELO算法,刚开始的时候并不清楚这个算法是做什么的,对此开始大量查找有关于ELO算法的资源,功夫不负有心人,总算找到一些有用的资源了. 先 ...

  6. HPU暑期集训积分赛2

    A. 再战斐波那契 单点时限: 1.0 sec 内存限制: 512 MB 小z 学会了斐波那契和 gcd 后,老师又给他出了个难题,求第N个和第M个斐波那契数的最大公约数,这可难倒了小z ,不过在小z ...

  7. Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3) A B C D 水 模拟 二分 贪心

    A. Is it rated? time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  8. ural 2020 Traffic Jam in Flower Town(模拟)

    2020. Traffic Jam in Flower Town Time limit: 1.0 secondMemory limit: 64 MB Having returned from Sun ...

  9. ural 2015 Zhenya moves from the dormitory(模拟)

    2015. Zhenya moves from the dormitory Time limit: 1.0 secondMemory limit: 64 MB After moving from hi ...

随机推荐

  1. CSS伪选择器的使用-遁地龙卷风

    分为伪元素选择器和伪类选择器两种,前者两个冒号,后者一个冒号,但是浏览器都看做一个冒号 1.a.::first-line 逐层匹配,直到有文本元素且结束改行为止 设置css属性word-break:b ...

  2. ProgressDialog使用总结

    以前对ProgressDialog不太熟练,特地看到的这个文章 ProgressDialog的使用  ProgressDialog 继承自AlertDialog,AlertDialog继承自Dialo ...

  3. [POJ3096]Surprising Strings

    [POJ3096]Surprising Strings 试题描述 The D-pairs of a string of letters are the ordered pairs of letters ...

  4. php中发送email

    一.使用PHP内置的mail()函数 看了一下手册,就直接开始写代码了,如下 <?php $to = "test@163.com"; //收件人 $subject = &qu ...

  5. 5.8---像素设定(CC150)

    注意:仔细注意位置. public static int[] renderPixel(int[] screen, int x, int y){ int[] ans = new int[screen.l ...

  6. jquery为新增元素添加事件

    <script type="text/javascript"> var $id=1; $(function(){ $(".hehe").click( ...

  7. 【GoLang】GoLang map 非线程安全 & 并发度写优化

    Catena (时序存储引擎)中有一个函数的实现备受争议,它从 map 中根据指定的 name 获取一个 metricSource.每一次插入操作都会至少调用一次这个函数,现实场景中该函数调用更是频繁 ...

  8. C# 接口基础

     接口只包含方法.属性.事件或索引器的签名. 实现接口的类或结构必须实现接口定义中指定的接口成员 接口中可以包含字段吗? 第一次被问到这个问题的时候被问愣住了,只能回答:印象当中没见过在接口中定义变量 ...

  9. HTML——meta标签

    <meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. <meta> 标签位于文档的头部,不包含任何内容.&l ...

  10. javascript特殊运算符

    in运算符                 in运算符要求其左边的运算数是一个字符串,或可以被转换为字符串,右边的运算数十一个对象或数组.如果该 运算符左边的值是右边对象的一个属性名,则返回true, ...