포카를 치는데, 셋이할때보다 넷이할때 좋은패가 뜰 Probability가 높았다. 이를 제대로 확인해보고자 확률계산 및 시뮬레이션을 구상하게 되었다. 이것을 통해서 이전의 주사위예제보다 좀더 실감나는 Probability공부가 될것이다.

확률계산

전체 52장의 카드 중에서 특정 7장을 뽑을 경우의 수

$$ {52 \choose 7} = \frac{52!}{7! \times 45!} = 133784560 $$

7장의 카드중에서 포커의 패로 사용할 5장을 고르는 경우의 수

$$ {7 \choose 5} = \frac{7!}{5! \times 2!} = 21 $$

Straight Flush 의 경우, 전체 52장 중에 특정카드 5개만을 골라야 하므로, 1/2598960 = 3.85e-7

$$ {52 \choose 5} = \frac{52!}{5! \times 47!} = 2598960 $$

Pocker 의 경우, 전체 52장 중에 특정카드 4개만을 고르는것이 숫자만큼(13)이므로, 13/270725 = 4.8e-5

$$ {52 \choose 4} = \frac{52!}{4! \times 48!} = 270725 $$

시뮬레이션구상

참여인원에 따른 가상게임을 만들고 10000번이상 실시하여, 그 유의함을 판단해본다.

Python소스 : PockerSimulation.py

Cards별 출현확률

이건, 셋이나 넷이나 상관없을것이다. 각게임에서 모든이들의 손에 쥐어질 족보를 몽땅계산했다. 8만번실시결과

cards

확률(%)

Straight Flush

0.03

Pocker

0.19875

House

2.70625

Flush

3.06375

Straight

4.69875

Triple

4.79625

Two Pair

23.21625

One Pair

43.875

None

17.415

각 Cards를 쥐었을때 승률

각각 2만번식 실시했을때 각 족보별 승률(%)

cards

2명시

3명시

4명시

5명시

6명시

7명시

Straight Flush

100

100

100

100

100

100

Pocker

100

97.89

100

99.38

98.54

100

House

98.52

96.75

94.31

93.38

91.33

89.43

Flush

96.27

91.17

86.81

82.22

79.46

76.46

Straight

92.30

83.34

78.33

71.12

66.30

60.63

Triple

85.80

76.74

67.70

57.31

49.66

42.43

Two Pair

72.06

53.73

37.76

29.38

22.12

16.87

One Pair

39.42

17.11

8.354

4.232

2.202

1.214

None

9.09

1.043

0.164

0.041

0.0048

0.0

인원수가 증가함에 따라 중간정도의 족보승률이 급격히 떨어진다. 중요한결론한가지. None가지고 있는데, 5명이서 같이 히든보고 펼쳤을때 이길확률은 스티플뜰확률이랑 비슷하다. ;

작업로그

2003-1-2

  • 게임작성, 인원수설정후 게임진행가능 인원수마다 7장의 카드를 받는다.

2003-1-5

  • 카드패 결정하는 부분작성중. flush등은 쉬운데, straight가 어렵다. 게다가 dict DataStructure에 sort가 의미없다는것을 어떻게 해결할것인가.. --yong27/2003-01-05

2003-1-6

  • straight만 빼고 나머지 족보 완성. 데이터 Sort Problem 해결

2003-1-7

  • straight인식문제 해결. 이 문제는 진짜 PoincareHowToSolveIt으로 풀었다. 버스안에서 곰곰히 생각하던중. DNADoubleHelix를 이루면서 renaturation되는 모습을 상상했다. 마치 지퍼가 맞아서 좌아악 매치되는것 같다고 했었다. 이 문제도 딱 그거란 생각이 들었고, 사용자의 카드를 기준으로 맞추는 것이 아니라, 이미 순서정보가 있는 리스트를 기준으로 맞추면 되리라 생각하고 풀었다.

  • 해결해야할 문제점들
    • 각 족보마다 리턴하는 것이 숫자/모양이 아니라 카드여야 한다. 이건 나중에 우열을 가릴때 필요하다.
    • 족보의 종합적 인식을 정확히 하도록 UnitTest를 충분히 만든다. 현재 one pair도 못맞추고있다.

    • 완성되면 사용자별 승률계산, 족보별 등장확률계산이 더불어 필요하다.

2003-1-8

  • 족보별 리턴값을 카드로 수정.
  • 족보별 인식 정확히 수행. 각종UnitTest통과

  • 해야할일
    • 우열가리기. 쪼끔 생각해봐야함
    • 사용자별 승률계산 족보별 등장확률계산
  • 이젠 정확히 맞춘다. 근데... 우열가리기를 어캐해야할지. 2차원배열(리스트내 리스트)에서 첫아이템만을 뽑는 걸 따로 맹그러야하나... 이걸 Matrix용어로 Transpose(전치행렬)이라고하지아마..

2003-1-11

  • 우열가리기 완성. judge라는 함수로 Game결과를 리스트로 받으면, 그중에서 제일 높은 넘의 인덱스와 이긴족보이름을 출력하게 만들었다. 처음엔 족보이름만으로 이긴경우, 두번째로 족보이름은 같아서 각각의 최상카드로 비교하는경우등 구현할것이 많았다. 한참만들다가 이런 복잡한걸 하는 생각에, 다른카드보다 높은가 메쏘드를 Cards 클래스에 직접 만들면 더 쉽지않을까 생각했다. 그렇게되면, aCard.isHighThan(bCard).isHighThan(cCard) 식으로 풀수 있었을거다. 그건 나중에 시간나면...

  • 족보별 등장확률계산 완성, 족보별 승률계산 완성 --yong27/2003-01-11

PockerSimulation (last edited 2011-11-30 19:21:25 by 152)

web biohackers.net