ポーカーの確率 番外
久しぶりの投稿です。
ブログの作成を 休止してはいません。
お伝えする内容が まだ整っていません。
今まで私が作った 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
2013年6月25日