데이터에 의한 확률로 값을 도출해야 한다.
타자와 투수의 대결에서 각각의 데이터에 의해 출루/아웃의 확률,
출루라면 타자의 데이터에 의해 안타/2루타/3루타/홈런의 확률,
아웃이라면 투수의 데이터에 의해 땅볼/뜬공/삼진의 확률,
한 타석 당 투구 수의 확률 이 있다.
사실 출루와 아웃의 케이스에 타자와 투수 양쪽의 데이터가 모두 사용되어야 하지만 너무 복잡해지므로 출루는 타자, 아웃은 투수의 데이터만 활용하기로 했다.
파이썬에서는 choice라는 함수를 활용했는데, 자바스크립트로는 직접 구현을 해야 했다.
const choiceByWeight = (options, weights) => {
const totalRate = weights.reduce((acc, rate) => acc + rate, 0)
const normalizedRate = weights.map(rate => rate / totalRate)
// 가중치에 의한 랜덤 인덱스 생성
const weightedRandomIndex = (weights) => {
const randomValue = Math.random()
let cumulativeWeight = 0
for (let i = 0; i < weights.length; i++) {
cumulativeWeight += weights[i]
if (randomValue <= cumulativeWeight) {
return i
}
}
return weights.length - 1
}
return options[weightedRandomIndex(normalizedRate)]
}
파라미터는 결과가 되는 케이스 리스트와 데이터에 의한 각각의 가중치를 받았다.
각 가중치의 확률에 따른 랜덤 값을 리턴한다.
이 함수에 타자/투수 대결, 출루 케이스, 아웃 케이스, 투구 수 케이스를 넣으면 된다.
하지만 대결과 출루 케이스는 데이터가 잘 준비되어 있지만, 아웃 케이스는 데이터에 비교적 관심이 없던 80, 90연대 기록은 누락되어 있었다. 투구 수 또한 데이터를 찾을 수 없었다. 때문에 동일 확률로 넣었다.
(아웃 케이스는 나중에 데이터가 있는 선수들만이라도 확률을 넣어줄 예정이다.)