이 글은 Claude Opus 4.7 을 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.


Part 1 에서 경마식 베팅의 유래·구조·승식 체계를 정리했습니다. 이번 편에서는 실제로 경마식 베팅을 서비스에 도입할 때 마주치는 엔지니어링/운영 이슈 와, 초기 유저가 부족할 때 풀을 채우기 위한 봇 유저 시뮬레이션 을 다룹니다.

전자는 경험 많은 설계자라면 체크리스트처럼 훑어도 좋고, 후자는 간단해 보이지만 제대로 구현하려면 생각보다 품이 많이 드는 주제입니다. 특히 “실제 사람이 건 것처럼” 보이게 하려면 단순 랜덤 함수로는 한참 부족합니다.


1. 시스템 설계 고려사항#

1-1. 풀 데이터 모델#

경마식 베팅의 첫 관문은 “승식별로 풀이 따로 존재한다” 는 사실을 데이터 모델에 정확히 반영하는 것입니다.

Race (한 경주)
 ├─ WinPool            (단승식 풀)
 │   ├─ HorsePool #1: 걸린 총액
 │   ├─ HorsePool #2: 걸린 총액
 │   └─ ...
 ├─ PlacePool          (연승식 풀)
 ├─ QuinellaPool       (복승식 풀)
 │   ├─ CombinationPool {A,B}: 걸린 총액
 │   ├─ CombinationPool {A,C}: 걸린 총액
 │   └─ ...
 ├─ ExactaPool         (쌍승식 풀)
 ├─ TrioPool           (삼복승식 풀)
 └─ TrifectaPool       (삼쌍승식 풀)

여기서 실수하기 쉬운 포인트 몇 가지가 있습니다.

  • 조합(combination) 키 정규화: 복승식 {A,B}{B,A} 는 같은 조합입니다. 키를 저장할 때 항상 정렬된 형태 (예: 말 번호 오름차순) 로 넣어야 키 충돌과 중복 집계를 피할 수 있습니다.
  • 승식별 개별 테이블 vs 단일 테이블: 로우 수가 많아지지만 bet_type 컬럼을 둔 단일 테이블이 운영상 편합니다. 승식별 쿼리는 인덱스로 해결합니다.
  • 원자성: 한 베팅이 풀에 반영되는 트랜잭션과, 유저 잔액에서 차감되는 트랜잭션이 반드시 원자적으로 묶여야 합니다. 일부 베팅만 반영된 상태로 서버가 죽으면 풀과 잔액이 어긋납니다.

1-2. 테이크아웃 정책#

Part 1 에서 짚었듯 승식별로 테이크아웃 비율을 다르게 두는 것이 일반적입니다. 고배당 승식(삼쌍승, 픽6 등) 에 높은 비율을 매기는 이유는 두 가지입니다.

  • 고배당 승식의 한 번 당첨 시 체감 만족도가 크기 때문에 몇 퍼센트 더 떼어도 유저가 상대적으로 덜 민감합니다.
  • 적중자가 드물어 배당이 극단적으로 커질 수 있는데, 높은 테이크아웃이 풀의 변동성을 완충 합니다.

실무에서는 테이크아웃을 단일 상수가 아니라 운영 구간별 파라미터 로 두는 것이 좋습니다. 예를 들어 출시 초기에는 15% 로 낮게 시작해 체감 배당을 높이고, 유저가 충분히 확보된 이후 18~20% 로 조정하는 식입니다. 단, 올리는 방향은 유저 저항이 크기 때문에 이벤트/프로모션으로 감쇄해야 합니다.

1-3. 최소 배당 보장과 브레이크#

파리뮤추얼의 약점 중 하나는 극도로 많은 사람이 몰린 인기마 에 걸었을 때 배당이 원금 이하로 내려갈 수 있다는 점입니다. 다음 세 가지 장치로 보완합니다.

  • 최저 배당(minimum payout): “1원당 최소 X원 지급” 의 플로어. 한국마사회 단승식은 1원당 1.0원의 플로어가 있습니다(원금 보장).
  • 브레이크(breakage): 계산 결과를 10원 단위 등으로 절사. 운영자 이익이면서, 계산/지급을 단순하게 해주는 장치.
  • 적중자 없음(refund/rollover): 특정 조합에 적중자가 0명이면, 해당 풀을 다음 경주로 이월하거나 전액 환급하는 룰.

이 세 가지는 서로 영향을 주기 때문에 하나만 정해서는 안 됩니다. 최저 배당을 보장하려면 운영자가 자기 자금으로 메워야 할 때가 있고, 이걸 테이크아웃에서 미리 덜어둘지, 별도 예비금 풀로 관리할지 결정해야 합니다.

1-4. 오즈 업데이트 주기#

실시간 서비스에서 가장 자주 부딪히는 엔지니어링 과제입니다.

  • 너무 자주: 서버 부하 증가, 화면이 정신없이 깜빡거려 UX 나쁨
  • 너무 뜸: 유저가 “내가 봤을 땐 배당 50배였는데 확정은 20배” 라며 혼란

실무에선 보통 10~30초 간격 batch 집계 + UI 애니메이션을 부드럽게 가 무난한 타협점입니다. 마감 직전 60초는 간격을 짧게(5~10초) 가져가고 화면에 “마감 임박” 같은 시각적 신호를 같이 주는 것이 좋습니다.

풀 집계 자체는 Redis 같은 인메모리 스토어에 승식 × 조합 키 → 누적액 을 증분 업데이트하고, 주기적으로 스냅샷을 찍어 클라이언트에 푸시하는 구조가 일반적입니다.

1-5. 마감과 동결#

경주 시작 T 초 전에 풀을 동결(freeze) 해야 합니다. 이때 몇 가지 시나리오를 정확히 처리해야 합니다.

  • 동결 이후 들어온 베팅: 즉시 거부. 이미 요청 큐에 대기 중이던 베팅도 마감 시점 타임스탬프로 판단.
  • 경주 취소: 전액 환급 처리. “Refund” 상태를 별도 관리해야 회계상 추적 가능.
  • 중도 기권/실격: 해당 말에 걸린 베팅 처리 룰을 사전 정의. 연승식에서 실격한 말에 걸린 베팅은 보통 무효 환급.

이런 케이스는 보통 테스트가 부족해서 문제가 터지는 영역입니다. 엣지 케이스별 테스트 시나리오 문서 를 미리 만들어두는 걸 권장합니다.

1-6. 담합/조작 방지#

운영자 대 베터의 제로섬이 아니므로 운영자의 결과 조작 유인은 낮지만, 다른 위험은 여전히 존재합니다.

  • 내부자 정보: 경주 참가자의 컨디션 정보가 새면 오즈 공정성이 깨짐
  • 자전거래(self-dealing): 한 유저가 여러 계정으로 풀을 조작해 자기 소수파 배당을 키우는 행위. 이론상으론 풀이 제로섬이라 순 이득이 없어 보이지만, 실제로는 고배당 승식에서 테이크아웃을 상쇄할 정도의 베팅 규모 를 부어 소수 조합에 집중 베팅하면 타 베터의 돈을 흡수하는 패턴이 가능합니다.

대응책으로는 IP/디바이스 핑거프린트 기반 복수 계정 탐지, 이상 집중 베팅 패턴 탐지, 베팅 상한 설정, KYC 같은 조치가 사용됩니다.

1-7. 캐리오버와 게이미피케이션#

픽6, 잭팟류 승식은 당첨자가 없을 경우 다음 회차로 이월됩니다. 이것만으로 유저의 기대감이 눈덩이처럼 불어나는 강력한 심리 장치가 됩니다.

게임 서비스라면 단순 이월을 넘어서 다음과 같은 메커닉을 얹을 수 있습니다.

  • 누적 금액 공개: “이번 주 잭팟 3억!” 같은 강조
  • 특별 이벤트일 보장 추첨: 이월이 일정 횟수 이상 지속되면 당첨자가 없어도 강제 지급 (로또의 2등 배당 분배 방식과 유사)
  • 시즌 랭킹: 누적 적중 지수나 ROI 기반 리더보드

1-8. 설계 체크리스트#

정리하자면 경마식 베팅 시스템을 만들 때의 의사결정 지점은 대략 다음과 같습니다.

항목 결정 사항
승식 집합 단승/연승만? 쌍승까지? 삼쌍승까지?
테이크아웃 승식별 비율, 초기/운영기 차등
최저 배당 원금 보장 여부, 브레이크 단위
이월 정책 캐리오버 허용, 강제 지급 조건
풀 집계 주기 10초/30초, 마감 임박 가속
이상 거래 탐지 복수 계정/이상 패턴 룰
경주 취소/기권 환급 룰
베팅 상한 계정별/경주별 상한

2. 초기 유동성 문제: 왜 봇이 필요한가#

새로 경마식 베팅 서비스를 론칭했다고 해봅시다. 첫 날엔 유저가 열 명 남짓입니다. 이때 마주치는 문제는 다음과 같습니다.

  • 풀이 너무 얇아서 배당이 극단적 입니다. 10명이 걸고 1명만 인기마에 걸었다면 그 사람 배당이 10배에 육박합니다. 확률적으로 비합리적인 배당이 자주 나오면 베터가 이탈합니다.
  • 오즈의 의미가 사라집니다. 파리뮤추얼 오즈는 “집단 지성 기반 확률 추정” 이지만, 표본이 10명이면 추정 자체가 노이즈입니다.
  • 고배당 승식은 풀 자체가 안 돌아갑니다. 삼쌍승에 아무도 걸지 않으면 풀이 0 원이 되어 적중자도 없고 배당도 계산 불가.

해결 방법은 크게 세 가지입니다.

  1. 운영자가 초기 풀을 부어둔다 (seed pool): 깔끔하지만 운영자가 리스크를 진다는 점에서 파리뮤추얼의 원리에서 벗어남.
  2. 최소 유저 수 확보 전까지 서비스 오픈 지연: 이상적이지만 닭/달걀 문제.
  3. 봇 유저가 사람처럼 베팅해 풀을 채운다: 실무에서 가장 자주 쓰이는 방식.

이 글에서는 3번에 집중합니다. 단, 법적·윤리적 영역이 있음을 강조해둡니다. 실제 현금이 오가는 도박성 서비스에서 운영자가 봇으로 풀을 조작하는 것은 사기에 해당할 수 있습니다. 이 글은 현금이 아닌 가상 포인트/재화 로 운영되는 게임성 서비스 (예: 판타지 경마 게임, 예측 기반 캐주얼 게임) 를 전제로 합니다.


3. 사람 베터의 행동 특성 이해하기#

봇을 사람답게 만들려면 먼저 사람이 어떻게 베팅하는지를 알아야 합니다. 수십 년 간의 연구와 현장 관찰에서 반복적으로 발견되는 패턴이 있습니다.

3-1. Favorite-Longshot Bias#

가장 잘 알려진 편향입니다. 인기마의 실제 승률은 오즈 기반 추정 승률보다 높고, 소수파는 낮습니다. 결과적으로 인기마에 건 사람의 기대 수익률이 소수파에 건 사람보다 높습니다.

원인에 대해서는 “소수파 베팅의 기대 효용이 높아서 (risk-seeking)”, “베터가 확률을 과대 추정 (probability weighting)” 등 여러 가설이 있습니다. 원인이 뭐든, 시뮬레이션에서는 소수파에 실제 확률보다 많이 돈이 걸리게 만들어야 현실적 입니다.

3-2. 마감 직전 쏠림#

베팅 패턴을 시간 축으로 보면 마감 직전 수 분에 전체 풀의 30~60% 가 쏟아져 들어옵니다. 이유는 두 가지.

  • 유저가 오즈 변화를 관찰하다가 마지막 순간에 결정
  • 전문 베터(sharps) 가 마감 임박 시점에 대량 베팅을 던져 오즈를 흔듦

봇 시뮬레이션에서도 이 타이밍 분포를 모사하지 않으면 “오즈가 마감 한참 전에 안정화되어 있는” 어색한 그래프가 나옵니다.

3-3. 금액 분포는 Log-normal#

한 베팅당 금액 분포는 정규분포가 아니라 로그 정규(log-normal) 에 가깝습니다. 대부분은 소액(최소 단위) 이지만 소수의 고액 베팅이 긴 꼬리를 이룹니다. 평균이 아닌 중앙값 기준으로 봐야 감각이 맞고, 99th percentile 은 중앙값의 수십 배에 달합니다.

3-4. 승식 선호도 분포#

현장 데이터 상 대략 다음과 같은 분포가 관찰됩니다 (경마장마다 편차 있음).

승식 베팅 건수 비중 금액 비중
단승 20~30% 25~35%
연승 15~20% 10~15%
복승 15~20% 15~20%
쌍승 10~15% 10~15%
삼복승 10~15% 10~15%
삼쌍승 15~25% 10~20%

삼쌍승은 건수 비중은 높지만 한 건당 금액은 낮은 특성이 있습니다. “소액으로 로또 노리기” 패턴이죠.

3-5. 다중 베팅과 박싱#

한 베터가 한 경주에 여러 조합에 분산 베팅 하는 것이 일반적입니다. 특히 삼쌍승에서 “A 를 1등으로 고정하고 2,3 등은 B,C,D 중에서” 같은 박스 베팅(box bet) 이 대중적입니다. 박스 베팅은 6개 조합을 동시에 거는 것과 같습니다.

봇을 “1 베팅 = 1 조합” 으로 단순화하면 조합 수 분포가 사람과 크게 달라집니다. 박싱 패턴을 반드시 포함해야 합니다.

3-6. Herding과 정보 반영#

오즈가 공개되어 있기 때문에 뒤늦게 베팅하는 사람은 앞선 베터들의 집단 판단에 영향을 받습니다. 결과적으로 오즈가 시간이 갈수록 수렴(convergence) 하는 경향이 있습니다. 봇 시뮬레이션에서도 초기에 변동성 있게 시작해 마감으로 갈수록 수렴하도록 설계하면 자연스럽습니다.


4. 봇 시뮬레이션 모델 설계#

이제 위 관찰을 모델링할 차례입니다. 봇 시뮬레이션은 대략 다음 4 단계 파이프라인으로 구성합니다.

[1] 각 말의 "실제 승률" 추정
[2] 봇 페르소나별 "인지 승률" 생성 (노이즈, 편향 주입)
[3] 봇별 승식 선택 → 조합 선택 → 금액 결정
[4] 베팅 타이밍 결정 → 풀 반영

4-1. 말별 승률 분포: Plackett-Luce#

경마는 “순위” 가 있는 경쟁이므로, 승률 모델로 흔히 쓰이는 것이 Plackett-Luce 모델 입니다. 각 말 i 에 실력 파라미터 θ_i > 0 을 부여하면, 말 i 가 1등일 확률은

P(i = 1st) = θ_i / Σ_j θ_j

이고, 1등이 i, 2등이 j 일 확률은

P(i, j) = ( θ_i / Σ_k θ_k ) × ( θ_j / Σ_{k ≠ i} θ_k )

처럼 축차적으로 계산됩니다. 3등까지 확장하면 삼쌍승식 확률 분포를 그대로 얻을 수 있습니다.

시뮬레이션에선 θ_i 를 경주마다 랜덤 샘플링(예: log-normal) 하고, 실제 결과도 이 분포에서 뽑으면 됩니다.

4-2. 봇 페르소나#

모든 봇이 동일한 룰로 움직이면 다양성이 부족해집니다. 현장에서 자주 쓰는 페르소나 분류 예시.

페르소나 비중 성향
Casual 50~60% 인기마 위주, 소액, 단승/연승 선호
Analyst 15~20% 정보에 기반한 중앙값 베팅, 복승/쌍승 선호
Longshot 15~25% 소수파 선호, 삼쌍승 다수 조합 박싱, 소액
Whale 3~5% 고액, 인기마 위주, 다양한 승식 혼합
Chaser 5~10% 이전 경주 손실을 만회하려 금액 증가 (gambler’s fallacy)

페르소나를 분리해 두면 나중에 “Whale 비중을 낮추자” 같은 파라미터 튜닝이 쉽습니다.

4-3. 인지 승률에 편향 주입#

Plackett-Luce 의 “실제 승률” 을 봇이 그대로 안다고 가정하면 승률에 비례한 깔끔한 오즈가 만들어져 너무 효율적 인 시장이 됩니다. 현실처럼 만들려면 몇 가지 노이즈와 편향을 주입해야 합니다.

  • 인지 노이즈: 실제 θ_i 에 로그 정규 노이즈를 곱해 봇의 인지 파라미터를 만듭니다. 즉 perceived_θ_i = θ_i × exp(ε_i), 여기서 ε_i ~ Normal(0, σ²).
  • Longshot 편향: 페르소나에 따라 소수파 확률을 일부러 부풀립니다. 예컨대 인지 확률 p_ip_i^0.8 로 거듭제곱한 뒤 재정규화하면 분포가 전반적으로 평평해지면서 소수파에 더 큰 가중치가 실립니다.
  • 집단 정보 반영: 마감에 가까워질수록 이미 공개된 시장 오즈로 봇 추정을 블렌딩합니다. perceived_p_i ← (1 - λ) × perceived_p_i + λ × market_p_i (λ 는 마감까지 남은 시간에 반비례).

4-4. 승식과 조합 선택#

  • 승식 선택: 페르소나별 승식 분포에서 카테고리컬 샘플링
  • 조합 선택: 해당 승식의 조합 공간에서, 인지 확률에 비례해 샘플링. 박싱 여부도 확률적으로 결정 (예: 30% 확률로 박스 베팅)
  • 박싱 규모: 삼쌍승 박스는 3~6 마리 선택이 일반적

4-5. 금액 샘플링#

로그 정규 분포 기반.

X ~ LogNormal(μ_persona, σ_persona)

최소 베팅 단위로 반올림하고, 페르소나별 상한을 적용합니다. Chaser 페르소나는 “연속 손실 k 번 후 금액을 1.5^k 배” 같은 조건부 증가 규칙을 추가합니다.

4-6. 타이밍#

전체 마감 시간 T[0, 1] 로 정규화하고, 베타 분포 Beta(α, β) 로 샘플링하면 자연스러운 꼬리 무거운 분포가 나옵니다. 예를 들어 α = 5, β = 2 는 오른쪽(마감 직전) 에 몰린 분포입니다. 페르소나별로 다르게 둘 수도 있습니다 (Whale 은 평균적으로 일찍 베팅, Casual 은 마감 직전 몰림 등).

4-7. 의사코드 (TypeScript)#

설명한 조각들을 하나로 엮으면 대략 이렇게 생깁니다.

type Persona = "casual" | "analyst" | "longshot" | "whale" | "chaser";

interface Horse { id: number; trueTheta: number; }
interface Bot { id: string; persona: Persona; balance: number; lossStreak: number; }

function simulateRace(bots: Bot[], horses: Horse[], deadlineMs: number) {
  const bets: Bet[] = [];

  for (const bot of bots) {
    // 1. 페르소나별 파라미터 조회
    const params = PERSONA_PARAMS[bot.persona];

    // 2. 인지 승률 계산 (노이즈 + 편향 주입)
    const perceivedProbs = perceive(horses, params);

    // 3. 베팅 횟수 결정 (페르소나별 카테고리컬)
    const numBets = samplePoisson(params.betsPerRaceMean);

    for (let i = 0; i < numBets; i++) {
      // 4. 승식 선택
      const betType = sampleBetType(params.betTypePrefs);

      // 5. 조합 선택 (박싱 포함)
      const combo = sampleCombo(betType, perceivedProbs, params.boxingRate);

      // 6. 금액 샘플링 (Chaser 는 lossStreak 반영)
      const stake = sampleStake(params, bot.lossStreak);

      // 7. 타이밍 샘플링 (Beta 분포)
      const timestampMs = sampleTiming(params, deadlineMs);

      bets.push({ bot: bot.id, betType, combo, stake, timestampMs });
    }
  }

  // 타임스탬프 순 정렬 후 풀에 차례대로 반영
  bets.sort((a, b) => a.timestampMs - b.timestampMs);
  for (const bet of bets) applyBetToPool(bet);

  return bets;
}

실제 구현 시 주의할 점.

  • 병렬성: 수만 봇을 시뮬레이션하려면 경주별 독립성을 이용해 CPU 병렬화
  • 재현성: 경주 시드를 기록해두면 특정 경주 재현 가능. QA 와 A/B 테스트에 필수
  • 파라미터 외부화: 페르소나 비중, 금액 분포 파라미터는 JSON/DB 로 분리해서 운영 중 조정 가능하게

5. 봇 데이터 품질 검증#

“만들었다” 로 끝이 아닙니다. 봇이 사람처럼 보이는지를 정량적으로 검증 해야 합니다.

5-1. 분포 일치성 지표#

실제 사람 베팅 데이터(다른 서비스의 공개 통계, 초기 베타 테스터 데이터 등) 와 봇 데이터를 아래 차원에서 비교합니다.

차원 비교 방법
승식별 건수 비중 카이제곱 검정 또는 단순 % 비교
금액 분포 KS 검정 (분포 자체 비교), QQ 플롯
타이밍 분포 KS 검정, 히스토그램 중첩
인기마/소수파 베팅 비중 오즈 구간별 집계 비교
조합당 베팅 수 (박싱) 히스토그램 비교

5-2. KL Divergence#

두 분포 P (실제), Q (봇) 의 차이를 정량화하는 대표 지표.

D_KL(P || Q) = Σ_x P(x) × log( P(x) / Q(x) )

0 에 가까울수록 두 분포가 비슷합니다. 승식 선택처럼 카테고리컬 분포에 적용하기 좋습니다.

5-3. 블라인드 리뷰#

정량 지표만으로는 놓치는 부분이 있습니다. 팀 내부에서 “이 경주의 베팅 히스토리는 사람 것일까 봇 것일까?” 블라인드 테스트를 하면 의외로 패턴을 잡아냅니다. 예를 들어 “같은 봇이 비슷한 시점에 비슷한 조합을 고정적으로 건다” 같은 인공적인 패턴은 정량 지표보다 육안으로 더 잘 잡힙니다.

5-4. 리얼 유저 진입 후 페이드 아웃#

봇은 영구 장치가 아니라 유동성 부트스트랩 장치 여야 합니다. 실제 유저가 늘수록 봇 비중을 줄여가는 페이드 아웃 정책 을 미리 설계해둬야 합니다. 그렇지 않으면 “봇이 사람 행세를 영구적으로 한다” 는 윤리적 문제가 커집니다.

기준 예시:

  • 인간 베팅 금액 비중이 풀 전체의 X% 를 넘으면 봇 비중 자동 감소
  • 각 경주별 봇/사람 비중을 대시보드로 상시 모니터링
  • 일정 시점 이후 봇 사용 종료 목표를 로드맵에 명시

6. 운영상/법적 유의점#

마지막으로 Part 2 를 마무리하기 전에 반드시 짚어둘 부분입니다.

  • 현금성 베팅은 법에 따라 운영 주체가 제한됩니다. 한국에서 현금 경마식 베팅은 마사회/경륜공단/경정공단만 합법입니다. 민간이 현금 경마식 서비스를 만들면 불법 사행 행위가 됩니다.
  • 가상 재화 기반 서비스 도 환전 가능성이 있으면 규제 대상이 됩니다. 아이템, 토큰이 현금화 가능한 구조라면 사전 법률 검토가 필수입니다.
  • 봇이 사람을 사칭하는 것 자체가 이용 약관 이슈 일 수 있습니다. 봇임을 명시하거나, “초기 유동성 확보를 위한 시뮬레이션” 임을 투명하게 공개하는 쪽이 장기적으로 안전합니다.
  • 미성년자 접근 차단, 환급 한도, 플레이 시간 제한 같은 보호 장치도 함께 고려해야 합니다.

기술적으로 잘 만든다고 끝나는 영역이 아닙니다. 게임 기획과 법무 검토가 동시에 진행되어야 합니다.


7. 마치며#

Part 1 과 Part 2 를 통해 경마식 베팅의 역사적 기원부터 시스템 설계 실무까지를 관통해 훑어봤습니다.

  • Part 1: 파리뮤추얼의 구조, 승식 체계, favorite-longshot bias 같은 특징
  • Part 2: 풀 데이터 모델, 테이크아웃/최저 배당/캐리오버 같은 설계 의사결정, 그리고 초기 유동성 확보를 위한 봇 시뮬레이션 파이프라인과 검증 기법

제 경험상, 경마식 베팅을 도입한 게임/서비스에서 가장 흔한 실패 모드는 두 가지입니다.

  1. 승식 체계를 얕게 잡아서 유저 타입별 재미가 부족 — 단승만 넣으면 금방 단조로워집니다.
  2. 초기 풀이 너무 얇아 오즈가 괴물처럼 널뛰어 유저가 이탈 — 봇 시뮬레이션을 처음부터 진지하게 설계하지 않으면 거의 필연적으로 만납니다.

이 두 편의 가이드가 둘 중 어느 함정도 피하는 데 도움이 되기를 바랍니다. 경마식 베팅은 오래된 메커니즘인 만큼 수십 년의 현장 검증이 쌓여 있고, 그 지혜를 가져다 쓰면 완전히 새로운 설계를 혼자 만드는 것보다 훨씬 빠르고 안전하게 좋은 게임을 만들 수 있습니다.


References#