ポーカーの確率 番外

BASIC ポーカーの確率

久しぶりの投稿です。
ブログの作成を 休止してはいません。

お伝えする内容が まだ整っていません。
今まで私が作った BASIC のプログラムで 気に入っているものを 載せておきます。
バソコンの黎明期頃に作ったプログラムの リメイク版です。
当時は 計算結果がでるまで 12時間ほどかかりました。
今は 数分ほどです。

ポーカー役手を全数チェックするものです。
! 以下をコピーして実行してください。

! フリーウエアー 十進BASIC でプログラム     
! http://hp.vector.co.jp/authors/VA008683/ を参照  
! http://hp.vector.co.jp/authors/VA008683/english/index.htm 英語版        
! ポーカーの確率計算
OPTION BASE 0
DIM A(52,1)
LET  TT$=TIME$
LET  C4C=0
LET  CfH=0
LET  C3C=0
LET  C2P=0
LET  C1P=0
LET  RSF=0
LET  SFL=0
LET  FLS=0
LET  STR=0
LET  NP=0
LET  B=0
LET  CNT1=0
LET  CNT2=0

!     52枚の札を1~52の番号付けをする
!        種類の区別は 0001, 0010, 0100, 1000 の4通り
!        数字の区別は 0000000000001, 0000000000010 ~ 1000000000000 の 13通り
!        種類と数字のペア52通り として 登録 
FOR I=0 TO 3
   FOR J=0 TO 12
      LET  B=B+1
      LET  A(B,0)=10^I
      LET  A(B,1)=10^J
   NEXT J
NEXT I

! 52枚の札を1~52の番号付けして、ゼロと重複を認めない5桁の53進数
!    として表現し、それぞれの5桁の数列の中で、上位にある数は下位にある数
!    より小さいという条件で数列をつくり 2598960通り作成
!    5枚の札の組み合わせの特徴の表現は <例えばRSF>
!     種類 0005, 0050, 0500, 5000 と 数字 1000000001111 の 4種の組合せ  

PRINT CNT1,TT$                                    

FOR K= 1 TO 52-4
   FOR L=K+1 TO 52-3
      FOR M=L+1 TO 52-2
         FOR N=M+1 TO 52-1
            FOR O=N+1 TO 52
               LET  AA =A(K,0)+A(L,0)+A(M,0)+A(N,0)+A(O,0)+9*10^4
               LET  BB =A(K,1)+A(L,1)+A(M,1)+A(N,1)+A(O,1)+9*10^13
               LET  AA$=STR$(AA) 
               LET  BB$=STR$(BB)
               LET  A$=AA$(2:5)
               LET  B$=BB$(2:14) 
               LET  X=POS(B$,"4",1)  ! 同じ数字が4枚あるか
               IF X > 0 THEN 
                  LET  C4C=C4C+1     !4カード
                  GOTO 1000
               END IF
               LET  Y=POS(B$,"3",1)
               IF Y > 0 THEN GOTO 900 ELSE GOTO 901
900                REM
                   IF POS(B$,"2",1)  >0 THEN 
                      LET  CFH=CFH+1  !フルハウス
                      GOTO 1000
                   END IF
                   LET  C3C=C3C+1     !3カード
                   GOTO 1000
901                REM
                   LET  Z=POS(B$,"2",1)
                   IF Z > 0 THEN GOTO 902 ELSE GOTO 903

902                REM
                   IF POS(B$,"2",Z+1)  >0 THEN 
                      LET  C2P=C2P+1  !2ペアー
                      GOTO 1000
                   END IF
                   LET  C1P=C1P+1     !1ペアー
                   GOTO 1000              
903                REM    1枚も同じ数が無い数列                   
                   LET  ZZ=POS(A$,"5",1)                          
                   LET  ZX=POS(B$,"1",1) 
                   LET  ZX$=B$(ZX+1:ZX+4)
                   LET  ZY$=B$(10:13)
                   IF ZZ=0 THEN  GOTO 904 ELSE GOTO 905             
904                REM              
                   IF          ZX$="1111" THEN 
                      LET  STR=STR+1
                      GOTO 1000 
                   END IF
                   IF ZX=1 AND ZY$="1111" THEN 
                      LET  STR=STR+1
                      GOTO 1000
                   END IF
                   LET  NP =NP+1 
                   GOTO 1000 
905                REM  
                   IF          ZX$="1111" THEN 
                      LET  SFL=SFL+1
                      GOTO 1000 
                   END IF
                   IF ZX=1 AND ZY$="1111" THEN 
                      LET  RSF=RSF+1
                      GOTO 1000
                   END IF           
                   LET  FLS=FLS+1                   
1000                REM
                    LET  CNT1=CNT1+1
                    LET  CNT2=CNT2+1 
                    IF CNT2=100000 THEN 
                       LET  CNT2 = 0 
                       PRINT CNT1,TIME$                                       
                    END IF
                 NEXT O
              NEXT N
           NEXT M
        NEXT L
     NEXT K
     PRINT CNT1,TIME$                                       

     PRINT "Royal flush          =",RSF
     PRINT "Straight flush       =",SFL
     PRINT "Four of a kind       =",C4C
     PRINT "Full house           =",CFH
     PRINT "Flush                =",FLS
     PRINT "Straight             =",STR        
     PRINT "Three of a kind      =",C3C
     PRINT "Two pair             =",C2P
     PRINT "One pair             =",C1P
     PRINT "No pair              =",NP 
     PRINT "Total                =",CNT1    
  END
! コピー終わり

私のパソコンでは RUN して 1分 34秒後に 以下の OUT PUT がありました。

Royal flush          =   4 
Straight flush       =   36 
Four of a kind       =   624 
Full house           =   3744 
Flush                =   5108 
Straight             =   10200 
Three of a kind      =   54912 
Two pair             =   123552 
One pair             =   1098240 
No pair              =   1302540 
Total                =   2598960

« »