양자컴퓨터에게 가위·바위·보를 시키면 세 선택지가 정말 똑같이 나올까요? 이번에는 2개의 큐비트로 4가지 비트 결과를 만든 뒤 하나를 제외하는 방식으로 가위바위보를 10,000번 실행했습니다. 양자 측정, 확률, 무작위 선택의 연결을 확인해보시죠.

가위바위보는 아주 단순한 게임이지만 한 가지 조건이 중요합니다. 가위, 바위, 보 중 어느 하나도 더 자주 선택되면 안 된다는 점입니다.
그렇다면 양자컴퓨터에 가위바위보 선택을 맡기면 세 가지 결과가 정말 공평하게 나올까요?
이번 실험에서는 Qiskit으로 2개의 큐비트를 준비한 뒤 각각 Hadamard Gate를 적용했습니다. 이렇게 하면 이상적인 조건에서 00, 01, 10, 11이라는 네 가지 측정 결과가 각각 같은 확률로 나타납니다.
하지만 가위바위보에는 선택지가 세 개뿐입니다. 그래서 이번 실험에서는 00=가위, 01=바위, 10=보로 정하고, 11이 나오면 결과를 버리고 다시 선택하는 방법을 사용했습니다.
1. 가위바위보를 공평하게 만드는 게 생각보다 어려운 이유
큐비트 1개를 측정하면 0과 1이라는 두 가지 결과를 얻을 수 있습니다. 큐비트 2개를 사용하면 가능한 결과는 네 가지로 늘어납니다.
00011011
두 큐비트 모두에 Hadamard Gate를 적용하면 이상적인 상태에서는 네 결과의 측정확률이 각각 25%가 됩니다.
문제는 가위바위보에는 세 가지 선택지만 있다는 점입니다.
예를 들어 00=가위, 01=바위, 10=보로 지정한 뒤 남은 11까지 가위로 처리하면 어떻게 될까요?

| 측정값 | 선택 | 이론적 확률 |
|---|---|---|
| 00 | 가위 | 25% |
| 01 | 바위 | 25% |
| 10 | 보 | 25% |
| 11 | 가위 | 25% |
이렇게 하면 가위가 50%, 바위와 보는 각각 25%가 되어 완전히 불공평해집니다.
따라서 이번 실험에서는 11이 나오면 사용하지 않고 다시 선택하는 방식을 사용했습니다.
2. 이번 실험에서는 11이 나오면 다시 뽑기로 했다
이번 실험의 규칙은 다음과 같습니다.
| 양자 측정 결과 | 가위바위보 선택 |
|---|---|
| 00 | 가위 |
| 01 | 바위 |
| 10 | 보 |
| 11 | 버리고 다시 선택 |
네 상태가 각각 25%라면 유효한 결과인 00, 01, 10은 모두 같은 확률을 가집니다.
11만 제외하고 나머지 결과만 놓고 보면 가위·바위·보가 각각 약 1/3의 비율을 갖게 됩니다.
이처럼 사용할 수 없는 결과를 버리고 다시 추출하는 방식을 일반적으로 rejection sampling이라고 부릅니다.
일상적으로 생각하면 1부터 4까지 적힌 공을 뽑아 1·2·3만 사용하고, 4가 나오면 다시 뽑는 것과 비슷합니다.
3. Qiskit으로 큐비트 가위바위보 회로 만들기
이번 실험에서는 실제 QPU의 노이즈를 포함하지 않는 Qiskit의 StatevectorSampler를 사용했습니다.

- 사용 큐비트: 2개
- 사용 게이트: Hadamard Gate 2개
- 최종 유효 선택 횟수: 10,000회
- 버리는 결과: 11
- 실행환경: Qiskit StatevectorSampler
실험에 사용한 코드는 아래와 같습니다.
from qiskit import QuantumCircuit
from qiskit.primitives import StatevectorSampler
from collections import Counter
# 2큐비트 회로 생성
qc = QuantumCircuit(2)
# 각 큐비트에 Hadamard Gate 적용
qc.h(0)
qc.h(1)
# 측정 추가
qc.measure_all()
# 결과 재현을 위해 seed 지정
sampler = StatevectorSampler(seed=2026)
# 유효한 가위바위보 결과 10,000개를 확보하기 위해
# 여유 있게 20,000 shots 실행
raw_shots = 20000
result = sampler.run(
[qc],
shots=raw_shots
).result()
# 측정 순서를 유지한 비트열 가져오기
bitstrings = result[0].data.meas.get_bitstrings()
mapping = {
"00": "가위",
"01": "바위",
"10": "보"
}
target_choices = 10000
choices = []
attempts_used = 0
discarded = 0
for bits in bitstrings:
attempts_used += 1
# 11은 사용하지 않고 다시 뽑기
if bits == "11":
discarded += 1
continue
choices.append(mapping[bits])
if len(choices) == target_choices:
break
if len(choices) < target_choices:
raise RuntimeError(
"유효 결과 10,000개를 확보하지 못했습니다. "
"raw_shots를 늘려 다시 실행하세요."
)
# 최종 가위바위보 횟수 집계
choice_counts = Counter(choices)
# 실제 10,000개를 얻을 때까지 사용된 원시 비트 분포
raw_used_counts = Counter(bitstrings[:attempts_used])
print("=== 가위바위보 10,000회 결과 ===")
for choice in ["가위", "바위", "보"]:
count = choice_counts[choice]
percent = count / target_choices * 100
print(
f"{choice}: {count}회 "
f"({percent:.2f}%)"
)
print()
print("실제 사용한 양자 측정 횟수:", attempts_used)
print("11 폐기 횟수:", discarded)
print(
"폐기 비율:",
f"{discarded / attempts_used * 100:.2f}%"
)
print()
print("사용된 원시 비트 분포:")
print(raw_used_counts)
Qiskit의 측정 결과는 shot마다 비트열로 얻을 수 있습니다. 이번 코드에서는 측정 순서를 그대로 읽으면서 유효한 선택이 10,000개가 될 때까지 가위·바위·보로 변환했습니다.
4. 가위바위보를 10,000번 선택한 실제 결과
실행이 끝난 뒤 11을 제외하고 실제 가위바위보 선택이 정확히 10,000개가 되도록 결과를 집계했습니다.

| 선택 | 나온 횟수 | 비율 | 이론적 기대값 |
|---|---|---|---|
| 가위 | 3,356회 | 33.56% | 약 33.33% |
| 바위 | 3,320회 | 33.20% | 약 33.33% |
| 보 | 3,324회 | 33.24% | 약 33.33% |
제가 얻은 결과는 가위 3,356회, 바위 3,320회, 보 3,324회였습니다.
비율로 계산하면 각각 33.56%, 33.20%, 33.24%였습니다.
세 결과가 정확히 3,333회 또는 3,334회씩 나오지는 않았지만, 가장 많이 나온 가위와 가장 적게 나온 바위의 차이도 36회(0.36%p)에 불과했습니다. 10,000번을 반복해 보니 세 선택 모두 이론적인 확률인 33.33% 주변에 상당히 가깝게 모이는 모습을 확인할 수 있었습니다.
5. 11은 몇 번이나 버려졌을까?
이번 방식의 재미있는 부분은 가위바위보 결과 10,000개를 얻기 위해 양자회로를 정확히 10,000번만 측정하면 안 된다는 점입니다.
측정 결과 가운데 약 4분의 1은 11이기 때문에 이 결과는 가위바위보에 사용할 수 없습니다.
실제 실험에서는 유효한 가위바위보 결과 10,000개를 얻기 위해 총 13,262회의 측정 결과를 확인했습니다.
그중 11이 나온 횟수는 3,262회였고, 실제 폐기 비율은 24.60%였습니다.
이론적으로 네 상태가 모두 같은 확률이라면 11이 나올 확률은 25%입니다. 따라서 유효한 결과 10,000개를 확보하려면 평균적으로는 10,000번보다 더 많은 측정이 필요합니다.
6. 왜 세 결과가 정확히 33.33%씩 나오지는 않을까?
가위, 바위, 보가 공평하다고 해서 10,000번 실행했을 때 세 결과가 정확하게 같은 횟수로 나와야 하는 것은 아닙니다.
공정한 주사위를 여러 번 던져도 각 숫자가 완전히 똑같은 횟수로 나오지 않는 것과 같은 이유입니다.
이번 실험에서는 세 선택의 이론적인 확률은 각각 1/3이지만 실제 유한한 표본에서는 조금씩 차이가 발생합니다.
측정 횟수가 충분히 많아질수록 전체 비율이 약 33.33% 부근에서 안정되는지를 확인하는 것이 더 중요합니다.
양자회로에서 반복 측정 횟수가 왜 중요한지는 양자컴퓨팅에서 회로 실행 횟수가 중요한 이유에서도 자세히 살펴볼 수 있습니다.
7. 이 실험에서 중요한 것은 가위바위보 자체가 아니다
실제로 양자컴퓨터를 가위바위보 게임기로 사용하는 것이 이번 실험의 목적은 아닙니다.
중요한 부분은 2진수 기반의 결과를 세 개의 공평한 선택지로 바꾸는 과정입니다.
비슷한 문제는 일상에서도 쉽게 찾을 수 있습니다. 세 사람 중 한 명을 무작위로 정하거나, 세 개의 메뉴 가운데 하나를 선택하거나, 세 팀 중 먼저 시작할 팀을 고르는 상황이 대표적입니다.
단순히 2진 결과를 세 선택지에 아무렇게나 대응시키면 확률이 달라질 수 있고, 남는 결과를 어떻게 처리하느냐에 따라 공정성이 달라집니다.
이번 실험은 큐비트의 중첩과 측정을 이용하면서 동시에 공정한 무작위 선택에는 결과를 해석하는 고전적인 후처리도 중요하다는 점을 보여줍니다.
8. 직접 실험하면서 확인할 수 있었던 점
이번 실험에서는 두 큐비트에 Hadamard Gate를 적용해 네 가지 비트열을 만들고, 그중 세 가지 결과만 가위바위보에 사용했습니다.
이 과정을 통해 큐비트가 여러 가능한 측정 결과를 만들 수 있다는 것뿐 아니라 양자 측정값을 실제 문제에 적용하려면 결과를 어떻게 매핑할지도 설계해야 한다는 점을 확인할 수 있었습니다.
특히 11을 특정 선택에 억지로 배정했다면 가위·바위·보 중 하나가 두 배 높은 확률을 갖게 됩니다. 반대로 11을 버리고 다시 선택하면 유효한 세 결과의 확률을 동일하게 유지할 수 있습니다.
다음 실험에서는 가위바위보보다 조금 더 실생활에 가까운 상황으로, 점심 메뉴 4개 가운데 하나를 양자회로가 선택하게 하면 어떤 결과가 나오는지 확인해볼 수 있습니다.