야구놀자 ver.3 - 4) 데이터에 의한 랜덤 값 추출

Dzeko·2024년 3월 8일
0

개발일지

목록 보기
108/112

데이터에 의한 확률로 값을 도출해야 한다.

타자와 투수의 대결에서 각각의 데이터에 의해 출루/아웃의 확률,
출루라면 타자의 데이터에 의해 안타/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연대 기록은 누락되어 있었다. 투구 수 또한 데이터를 찾을 수 없었다. 때문에 동일 확률로 넣었다.
(아웃 케이스는 나중에 데이터가 있는 선수들만이라도 확률을 넣어줄 예정이다.)

profile
Hound on the Code

0개의 댓글