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. 支付宝Payto接口的C#.net实现方法

    例一: using System; using System.Data; using System.Configuration; using System.Collections; using Sys ...

  2. Redis优化之CPU充分利用

    Linux Redis Server之CPU充分利用 不知道大家有没有注意到你们公司的集群配置是否是有一种配置是这样的: 多个Redis Server分布在同一个节点,只是端口不同,如果有的话,应该是 ...

  3. python对象的生命周期

    引言 碰到以下问题: 代码1: from Tkinter import * root = Tk() photo = PhotoImage(file=r'E:\workspace\python\111. ...

  4. Android俄罗斯方块AI设计文档

    首先上源码: https://github.com/bingghost/SimpleTetris 一.概要 使用了2种AI算法: 一种是经典的Pierre Dellacherie算法 一种基于基于深度 ...

  5. 3分钟,9个Q&A让你快速知道Docker到底是什么

    不论是Google.Amazon.Microsoft.VMware都纷纷拥戴,加入Docker和Container所掀起的新时代云端虚拟化行列,这两项技术成为了IT界的新趋势.Docker和Conta ...

  6. 图解SSL/TLS协议(HTTPS的安全层)

    http://blog.csdn.net/wallezhe/article/details/50977337 图解SSL/TLS协议     作者: 阮一峰 日期: 2014年9月20日 本周,Clo ...

  7. 基于“事件”驱动的领域驱动设计(DDD)框架分析

    摘抄自 从去年10月份开始,学了几个月的领域驱动设计(Domain Driven Design,简称DDD).主要是学习领域驱动设计之父Eric Evans的名著:<Domain-driven ...

  8. java基础学习04(数组与方法)

    数组与方法 一.完成的目标 1. 掌握数组的定义.使用方法.引用传递 2. 掌握方法及其方法的重载 3. 使用方法接收和返回一个数组 4. java新特性对数组的操作支持 二.数组的定义和使用 数组是 ...

  9. 2106 Problem F Shuffling Along 中石油-未提交-->已提交

    题目描述 Most of you have played card games (and if you haven’t, why not???) in which the deck of cards ...

  10. ZipArchive和SSZipArchive使用详解

    一.SSZipArchive 1.简介 SSZipArchive是iOS和Mac上一个简单实用的压缩和解压插件.用途包括:1.解压zip文件:2.解压密码保护的ZIP文件:3.创建新的zip文件:4. ...