숫자와 시계
크래시는 로켓과의 경주처럼 보이지만, 기계적으로는 훨씬 단순한 두 가지로 이루어져 있습니다. 라운드가 시작되기 전에 엔진은 커밋된 해시로부터 숨겨진 숫자, 즉 버스트 포인트를 하나 뽑습니다. 그다음 시계가 시작되고 배수가 고정된 곡선을 따라 상승합니다. 곡선이 버스트 포인트에 도달하면 라운드가 끝나고, 아직 타고 있던 모든 사람은 베팅액을 잃습니다. 캐시아웃 — 수동이든, 라운드 전에 설정한 오토 타겟이든 — 은 그 순간 배수를 고정시키고 베팅액 곱하기 배수를 지급합니다. 비행 자체에는 아무런 무작위성이 없습니다. 라운드에서 유일하게 무작위인 것은 그 전에 뽑힌 숫자뿐입니다.
엔진 검증됨하우스 서비스(crash/CrashEngine.kt)의 CrashDerivation.crashPoint100()은 클라이언트의 _shared/rng.ts에 있는 bust100()과 동일합니다: h는 HMAC-SHA256(체인 링크, 솔트)의 상위 52비트이며, e = 2⁵², n = 100일 때 버스트 포인트(100분의 1 단위)는 floor((n·e − h) ÷ (e − h))이고 100에서 1,000,000 사이로 제한됩니다. 이는 bustabit 공식으로, 클라이언트 검증기와 서버가 비트 단위로 일치하도록 정수로 계산됩니다. 1% 엣지는 n에 들어 있습니다: n = 101 − 100 × 하우스 엣지, 즉 1%일 때 100입니다.
엔진 검증됨같은 파일의 multiplier100()과 클라이언트의 crash/api.ts에 있는 crashMultiplier(): t초 후의 실시간 배수는 floor(100 × e^(0.069314718 t))(100분의 1 단위)이며 100 미만으로 내려가지 않습니다. 증가 상수는 ln 2 ÷ 10이므로 배수는 10초마다 두 배가 됩니다. msToReach()는 이를 역산하여 버스트 시점을 스케줄링합니다.
무작위 부분을 분수 u = h ÷ 2⁵²로 쓰면, 0과 1 사이에 고르게 분포하며, 버스트 공식은 floor((100 − u) ÷ (1 − u))(100분의 1 단위)가 됩니다. u = 0일 때 이는 정확히 100, 즉 곡선이 움직이기도 전에 ×1.00에서 버스트가 발생합니다. u가 1에 가까워지면 값이 폭주하고, 클램프가 1,000,000(즉 ×10,000)에서 멈춥니다. 아래의 모든 내용은 이 한 줄과 승리로 인정되는 엄격한 규칙에서 비롯됩니다.
엄밀히 초과: 가격을 결정하는 규칙
엔진 검증됨crash/CrashEngine.kt의 settleCrash()와 applyAutoCashouts(): 오토 타겟은 target < 버스트 포인트(“auto < crashPoint100”)일 때만 지급되며, 타겟이 버스트 포인트와 같으면 버스트됩니다. 비행 도중 도달 가능한 배수는 버스트 포인트 − 1로 제한되므로, 오토 타겟은 실시간 곡선이 그 지점에 도달하는 순간 발동하며 버스트 포인트를 넘지 않습니다. cashout(): 실시간 배수 m에서의 수동 캐시아웃은 m ≥ 버스트 포인트일 때 거부됩니다. 지급액은 베팅액 × 배수 ÷ 100이며 코인의 최소 단위로 내림(mult(), RoundingMode.FLOOR) 처리됩니다.
이것이 배당을 결정짓는 세부 사항입니다. T(100분의 1 단위)의 타겟은 버스트 포인트가 T와 같을 때는 이기지 못하며, 버스트 포인트가 최소 T + 1일 때만 승리합니다. 공식에 따르면 버스트 포인트가 최소 K(100분의 1 단위) 이상일 확률은 101 이상의 모든 K에 대해 99 ÷ (K − 1)이므로, 최소 T + 1일 확률은 99 ÷ T입니다. ×2 타겟의 경우 이는 99 ÷ 200 = 49.50%입니다. ×2 배당을 곱하면 환원율은 0.99이며, 모든 타겟에서 T는 같은 방식으로 상쇄됩니다.
| 타겟 | 승률 | 1회 승리당 | 환원율 | 하우스 엣지 | 단위 베팅당 변동폭 | 도달 시점 |
|---|---|---|---|---|---|---|
| ×1.01 | 98.02% | 1.02 라운드 | 99.00% | 1.00% | 0.14 | 0.14 s |
| ×1.10 | 90.00% | 1.11 | 99.00% | 1.00% | 0.33 | 1.4 s |
| ×1.20 | 82.50% | 1.21 | 99.00% | 1.00% | 0.46 | 2.6 s |
| ×1.50 | 66.00% | 1.52 | 99.00% | 1.00% | 0.71 | 5.8 s |
| ×1.98 | 50.00% | 2.00 | 99.00% | 1.00% | 0.99 | 9.9 s |
| ×2.00 | 49.50% | 2.02 | 99.00% | 1.00% | 1.00 | 10.0 s |
| ×3.00 | 33.00% | 3.03 | 99.00% | 1.00% | 1.41 | 15.8초 |
| ×5.00 | 19.80% | 5.05 | 99.00% | 1.00% | 1.99 | 23.2초 |
| ×10 | 9.90% | 10.1 | 99.00% | 1.00% | 2.99 | 33.2초 |
| ×20 | 4.95% | 20.2 | 99.00% | 1.00% | 4.34 | 43.2 s |
| ×50 | 1.98% | 50.5 | 99.00% | 1.00% | 6.97 | 56.4 s |
| ×100 | 0.99% | 101 | 99.00% | 1.00% | 9.90 | 66.4 s |
| ×1,000 | 0.099% | 1,010 | 99.00% | 1.00% | 31.4 | 99.7 s |
| ×9,999.99 | 0.0099% | 10,101 | 99.00% | 1.00% | 99.5 | 132.9 s |
승리 확률 = 99 ÷ T (T는 백분의 1 단위의 목표 배수), 엄격한 규칙 하에서 정확함. 배당 = 목표 배수 × 승리 확률 = 모든 행에서 0.99. 스윙은 유닛당 스테이크 기준 한 라운드 결과의 표준편차로, √(0.99 × 목표 배수 − 0.9801)로 계산됩니다. '도달 시간'은 더블링 커브 상에서 10 × log₂(목표 배수) 초입니다. 베팅 폼이 허용하는 가장 낮은 목표 배수는 ×1.01이며, ×10,000.00은 버스트 상한 그 자체이므로 그 지점의 목표는 결코 버스트보다 엄격히 낮을 수 없어, ×9,999.99가 표의 최상단이 됩니다.
가운데 두 열은 변하지 않습니다. 이 규칙 하에서 크래시는 림보와 정확히 똑같이 가격이 매겨집니다: 어떤 목표 배수를 고르든, ×1.37에서 수동으로 캐시아웃하든 ×500에서 자동 목표를 설정하든, 스테이크 1단위당 1%입니다. 목표 배수가 바꾸는 것은 결과의 형태입니다 — ×1.10에서의 작은 승리들의 연속, ×1,000에서의 가뭄 끝 대박 — 그리고 마지막 두 열이 그것을 측정합니다. ×2에서는 한 라운드가 대략 스테이크 1배만큼 흔들리지만, ×1,000에서는 31배만큼 흔들립니다. ×1,000까지 가는 과정도 100초가 걸리는데, 이는 또 다른 종류의 비용입니다.
한 행은 다시 살펴볼 가치가 있습니다. ×1.98은 정확히 절반의 확률로 승리하며, 이는 그것을 중앙값 버스트 지점으로 만듭니다: 모든 라운드의 절반은 ×1.98 위에서 버스트하고 절반은 그 지점이거나 그 이하에서 버스트합니다. 깔끔한 숫자 ×2.00은 0.5포인트 핸디캡이 있는 동전 던지기로, 49.50%이며, 그 0.5포인트가 바로 그 목표 배수에서 1%가 존재하는 곳입니다.
보이는 것과 지급되는 것: 100분의 1의 간극
비슷하게 들리지만 다른 두 가지 질문이 있습니다. 커브가 ×2.00을 얼마나 자주 보여주는가? 그리고 ×2.00 목표가 얼마나 자주 지급되는가? 첫 번째는 버스트 지점이 최소 200 백분의 1일 확률로, 99 ÷ 199 = 49.75%입니다. 두 번째는 최소 201일 확률로, 99 ÷ 200 = 49.50%입니다. 그 차이, 402라운드 중 1라운드는 정확히 ×2.00에서 버스트하는 라운드입니다: 화면은 그 숫자에 도달하지만 티켓은 패배합니다.
| 배율 | 곡선이 도달함 | 목표가 지급됨 | 정확히 거기서 터짐 |
|---|---|---|---|
| ×1.01 | 99.00% | 98.02% | 0.98%, 102분의 1 |
| ×1.10 | 90.83% | 90.00% | 0.83%, 121분의 1 |
| ×1.50 | 66.44% | 66.00% | 0.44%, 226분의 1 |
| ×2.00 | 49.75% | 49.50% | 0.25%, 402분의 1 |
| ×3.00 | 33.11% | 33.00% | 0.11%, 906분의 1 |
| ×5.00 | 19.84% | 19.80% | 0.040%, 2,520분의 1 |
| ×10 | 9.910% | 9.900% | 0.0099%, 10,091분의 1 |
| ×100 | 0.9901% | 0.9900% | 1,010,000분의 1 |
도달 확률 = 99 ÷ (T − 1); 지급 확률 = 99 ÷ T; 그 차이는 99 ÷ (T (T − 1))로, 단 하나의 백분의 T에 걸린 확률 질량입니다. 이 차이는 낮은 타겟에서는 중요하지만 높은 타겟으로 갈수록 사라집니다.
이 차이가 바로 엔진이 버스트 포인트를 나중에 반올림되는 소수가 아니라 정수 단위의 백분의 1 값으로 뽑는 이유입니다. 정수 추첨 방식에서는 엄격한 규칙에 따라 모든 타겟에서 정확히 백분의 1이 하우스에게 돌아가며, 바로 그 백분의 1이 환수율을 0.99보다 약간 높은 값이 아니라 정확히 0.99로 만듭니다. 이전에 우리가 림보와 크래시를 비교했던 글에서는 크래시의 가격을 “도달 확률” 열, 즉 99x ÷ (100x − 1)로 매겼고, 짧은 라이드가 99%보다 아주 조금 더 저렴하다고 결론 내렸습니다. 그건 잘못된 열이었습니다: 엔진의 엄격한 정산 방식 아래에서는 모든 타겟에서 가격이 정확히 99.00%이며, 이제 그 기사에는 정정 내용이 반영되어 있습니다.
아무도 목표를 노리지 않을 때 버스트가 떨어지는 지점
누가 무엇에 베팅하든 상관없이 동일한 공식이 라운드 자체를 설명합니다. 버스트 포인트가 적어도 K 백분의 1 이상일 확률은 99 ÷ (K − 1)이며, 이것이 히스토리 바에 표시되는 전체 분포를 보여줍니다.
| 범위 | 라운드 비율 | 약 | 라운드 지속 시간 |
|---|---|---|---|
| ×1.00 (즉시 버스트) | 1.00% | 100분의 1 | 0초 |
| ×1.01 ~ ×1.99 | 49.25% | 2.0분의 1 | 0.1 ~ 9.9초 |
| ×2.00 ~ ×9.99 | 39.84% | 2.5분의 1 | 10 ~ 33초 |
| ×10 ~ ×99.99 | 8.92% | 11.2분의 1 | 33~66초 |
| ×100~×999.99 | 0.891% | 112분의 1 | 66~100초 |
| ×1,000~×9,999.99 | 0.0891% | 1,122분의 1 | 100~133초 |
| ×10,000.00 (상한선) | 0.0099% | 10,101분의 1 | 133초 |
각 행은 99 ÷ (하한 − 1) 빼기 99 ÷ 상한을, 100분의 1 단위로 나타낸 것입니다. 첫 번째 행은 (100 − u) ÷ (1 − u)가 101 미만으로 떨어질 확률, 즉 u < 1 ÷ 100인 경우입니다. 마지막 행은 클램프가 1,000,000 (100분의 1 단위)로 고정되는 모든 추첨입니다. 행들의 합은 100%입니다. 지속 시간은 10 × log₂(배당배수) 초입니다.
두 행만으로도 크래시 세션이 어떤 느낌인지 대부분 설명됩니다. 정확히 100라운드 중 1라운드는 곡선이 단 0.01도 움직이기 전인 ×1.00에서 터지며, ×1.01조차도 지급되지 않습니다. 그리고 약 10라운드 중 1라운드는 ×10에 도달하는데, 이는 한 시간에 여러 번 볼 수 있을 만큼 충분히 자주 발생해서 높은 목표도 도달 가능하게 느껴지게 만듭니다. 실제로 도달 가능하긴 합니다 — 표에 그 빈도가 나와 있으며, '기억에 남을 만큼 자주'와 '실제로 자주'는 다른 숫자입니다. 중앙값 라운드는 ×1.98에서 터지며 10초가 채 안 되고, 평균 라운드는 14.3초 지속되는데 드물게 발생하는 긴 비행이 평균을 끌어올리기 때문입니다.
여러분이 지켜보지 않았던 라운드들도 같은 분포에서 뽑힌 것이며, 각각은 새로운 체인 링크의 새로운 HMAC입니다. 히스토리 바에 ×500이 떴다고 해서 다음 ×500이 나올 확률이 이전보다 바뀌는 것은 아니며, 여전히 0.198%입니다. 이것이 가장 순수한 형태의 도박사의 오류입니다 — 여기서 독립성은 통계적 가정이 아니라 해시 자체의 속성입니다.
큰 배당배수를 쫓는 데 드는 비용
엣지가 어디서나 동일하기 때문에 목표 선택은 결국 분산에 대한 선택이며, 분산에는 명확히 말할 수 있는 대가가 있습니다: 몇 라운드를 기다려야 하는지, 그리고 긴 대기가 얼마나 가능성이 있는지입니다. 라운드당 승리 확률이 p일 때, N라운드 안에 적어도 한 번 승리할 확률은 1 − (1 − p)ᴺ입니다.
| 목표 | 라운드 | 최소 한 번 승리 | 전혀 승리하지 못함 | 테이블에서 보낸 시간 |
|---|---|---|---|---|
| ×2 | 10 | 99.89% | 0.11% | 약 4분 |
| ×10 | 20 | 87.57% | 12.43% | 약 8분 |
| ×10 | 50 | 99.46% | 0.54% | 약 20분 |
| ×100 | 100 | 63.03% | 36.97% | 약 41분 |
| ×100 | 300 | 94.95% | 5.05% | 약 2시간 |
| ×1,000 | 1,000 | 62.86% | 37.14% | 약 7시간 |
| ×1,000 | 3,000 | 94.88% | 5.12% | 약 20시간 |
1 − (1 − 99 ÷ T)ᴺ, 승률이 동일하므로 림보와 같습니다. 시간은 평균 비행 시간 14.3초에 10초의 베팅 대기 시간을 더한 라운드당 24.3초를 기준으로 계산했으며, ×1,000에서의 세션은 비행 시간보다는 대기 시간이 지배적입니다.
베팅을 걸면 산수는 냉정해집니다. ×100에서 1유닛짜리 베팅 100번은 100유닛이 들고 평균적으로 99유닛을 돌려받습니다 — 다시 말해 1%인데 — 하지만 이 평균은 약 100을 돌려받을 63% 확률과 아무것도 돌려받지 못할 37% 확률로 이루어져 있습니다. 목표가 무엇이든 유닛당 지불하는 1%는 변하지 않습니다. 변하는 것은 결과가 플레이어들 사이에 어떻게 분포되는가이고, 크래시에서는 곡선을 지켜보는 시간도 달라집니다.
같은 함정의 저배당 버전은 마틴게일입니다: ×2에 캐시아웃하고, 질 때마다 베팅을 두 배로 늘리고, 이길 때 1유닛을 챙깁니다. ×2에서 승률은 49.50%이고, 10연패가 일어날 확률은 0.11%이며, 11번째 베팅은 1,024유닛입니다. 가격이 매겨진 마틴게일은 룰렛 휠에서 이를 분석한 것이고, 크래시 수치는 그것과 0.1 포인트 이내로 일치합니다. 파산 위험은 1% 엣지에 맞서 고정 베팅 전략이 얼마나 오래 버티는지에 대한 일반 공식을 제시합니다.
수동 캐시아웃
수동 캐시아웃은 서버가 수신하는 순간 라이브 배율이 보여주는 백분의 일 단위로 지급되며, 단 그 값이 버스트 포인트보다 엄격히 낮아야 합니다. 곡선은 균등하게 틱하지 않습니다: floor(100 × e^(0.0693 t))는 ×1.01 근처에서는 143ms마다, ×2 근처에서는 72ms마다, ×10 근처에서는 14ms마다, ×100 근처에서는 1.4ms마다 1씩 증가합니다. ×10에서 버튼을 누르는 손은 몇 백분의 일 이내의 숫자를 선택하는 것이고, ×100에서는 몇 십분의 일 이내이며, 최종적으로 어느 숫자에 멈출지는 의도만큼이나 네트워크 지연에 의해 결정됩니다. 그렇다고 가격이 바뀌는 것은 아닙니다 — 각 백분의 일은 기댓값상 정확히 99%로 지급됩니다 — 하지만 이는 ×10 이상의 수동 목표가, 입력한 숫자에서 정확히 발동하는 자동 목표보다 더 느슨한 도구임을 의미합니다.
엔진 검증됨crashGame.tsx: 클라이언트는 floor(라이브 배율 × 100)이 자동 목표에 도달하는 순간 캐시아웃된 것으로 표시하며, 이는 서버의 applyAutoCashouts()와 일치하여 티켓을 정확히 목표 지점에 고정하고 이후의 수동 캐시아웃을 거부합니다. bet(): 101 백분의 일(×1.01) 미만의 자동 목표는 거부됩니다.
정산에서 실용적인 세부 사항 하나: 지급액은 베팅액 × 배율 ÷ 100을 코인의 최소 단위로 내림한 값이므로, ×1.23에서 0.37의 베팅액은 0.4551이 아니라 0.45를 지급합니다. 두 자리 소수 배율에서 둥근 베팅액이면 곱셈 결과가 정확히 떨어져 손실이 없지만, 작고 특이한 베팅액에서는 1유닛의 일부가 손실됩니다.
직접 라운드 검증하기
- 라운드 전에 패널은 체인의 커밋 해시와 솔트를 보여줍니다. 라운드 후에는 해당 라운드의 체인 링크를 공개합니다; 그 링크를 해싱하면 이전 라운드의 링크가 나와야 하며, 이것이 바로 순서가 사전에 고정되었음을 체인이 증명하는 방식입니다.
- 공개된 링크를 키로, 솔트를 메시지로 하여 HMAC-SHA256을 계산합니다. 다이제스트의 첫 52비트 — 첫 13개의 16진수 문자 — 를 h로 취합니다.
- floor((100 × 2⁵² − h) ÷ (2⁵² − h))를 정수 연산으로 계산하고 100–1,000,000 범위로 클램프합니다. 이것이 백분의 일 단위의 버스트 포인트이며, 라운드가 터진 숫자와 일치해야 합니다.
어떤 HMAC-SHA256 도구와 큰 수를 다룰 수 있는 계산기면 충분합니다; 오픈소스 검증기의 공용 HMAC 헬퍼도 동일한 원리를 사용합니다. 정수 나눗셈은 선택 사항이 아닙니다: 부동소수점 버전은 floor 경계에서 서버와 결과가 달라지며, 이는 바로 엄격한 규칙이 다루는 그 백분의 일 지점입니다. 하나의 반올림, 여러 개가 아니다는 검증기가 서버의 연산을 근사하지 않고 그대로 재현하는 이유를 설명합니다.
자주 묻는 질문
크래시에서 ×2에 이길 확률은 얼마인가요?
이 엔진에서는 49.50%입니다. 목표는 라운드가 그보다 엄격히 높게 터질 때만 지급되며, 버스트 포인트가 최소 201 백분의 일일 확률은 99 ÷ 200입니다. 곡선이 ×2.00에 도달하는 경우는 조금 더 많은 49.75%이며, 그 차이는 정확히 ×2.00에서 터지는 402번 중 1번에 해당합니다.
크래시의 하우스 엣지는 얼마인가요?
수동이든 자동이든 모든 캐시아웃 목표에서 1.00%입니다. 승률은 99 ÷ 목표(백분의 일 단위)이고 지급액은 목표 배율이므로, 모든 베팅은 평균적으로 베팅액의 99.00%를 돌려줍니다 — 이는 이 엔진에서 림보와 같은 가격입니다.
크래시가 1.00에서 터지는 빈도는 얼마나 되나요?
라운드의 정확히 1%, 100번 중 1번입니다. 버스트 포인트는 floor((100 − u) ÷ (1 − u)) 백분의 일이며, u가 1 ÷ 100 미만일 때마다 100이 됩니다. ×1.01조차도 이런 라운드에서는 지급되지 않습니다.
크래시에서 가장 좋은 캐시아웃 배율은 무엇인가요?
기댓값은 어디서든 없다: 모든 타겟은 베팅 금액 단위당 1%씩 비용이 든다. 낮은 타겟은 자주 소액을 지급하며 변동폭이 한 번의 베팅 금액 근처에 머물고, 높은 타겟은 드물게 지급되지만 수십 배의 베팅 금액만큼 변동한다. ×1.98은 정확히 50/50 지점이자 중앙값 버스트다.
크래시 라운드는 얼마나 지속되나요?
배수는 10초마다 두 배가 되므로, ×2는 10.0초, ×10은 33.2초, ×100은 66.4초, 그리고 ×10,000 상한은 132.9초에 도달합니다. 중앙값 라운드는 10초가 채 되기 전에 터지며, 평균 라운드는 14.3초 지속됩니다.
×10,000 오토 타겟이 지급될 수 있나요?
아니요. ×10,000.00은 버스트 상한이며, 타겟이 지급되려면 버스트보다 엄격히 낮아야 하므로, 지급될 수 있는 가장 높은 타겟은 ×9,999.99이며 이는 10,101라운드 중 한 번 발생합니다.
짧은 플레이에서는 크래시가 림보보다 저렴한가요?
이 엔진에서는 그렇지 않습니다. 이전 글에서는 곡선이 특정 배수에 도달할 확률을 기준으로 크래시의 가격을 매겼고 ×1.01에서 99.99%를 발견했지만, 엄격한 정산 기준으로는 유효한 확률이 1/100 낮아지며, 수익률은 림보와 마찬가지로 모든 타겟에서 정확히 99.00%입니다.
출처 및 참고자료
- Betkyo 엔진 소스, 하우스 서비스: crash/CrashEngine.kt의 CrashDerivation.crashPoint100(), multiplier100(), msToReach(), applyAutoCashouts(), settleCrash(), mult(), cashout() (bustabit 정수 버스트 포인트, 엄격한 “타겟 < 버스트 포인트” 정산, 단위 내림 지급, ×1.01 최소 오토 타겟)
- Betkyo 엔진 소스, 클라이언트: _shared/rng.ts의 bust100()과 h52() (동일한 정수 공식, BigInt); crash/api.ts의 CRASH_GROWTH_R과 crashMultiplier(); crash/crashGame.tsx의 오토 캐시아웃 표시 규칙
- 이 글을 위해 작성된 정확한 계산: 정수 공식으로부터 K ≥ 101에 대해 P(버스트 ≥ K) = 99 ÷ (K − 1), 엄격한 규칙에 따른 승리 확률 99 ÷ T, 도달 대비 지급 간격 99 ÷ (T (T − 1)), 구간별 버스트 분포, 비행 시간 10 × log₂(x), 모든 999,900개 버스트 값에 걸쳐 합산된 평균 비행 시간 14.3초, 그리고 적어도 한 번 승리할 확률
이 글에서 다루는 게임