Tính tổ hợp trong trò 3 lá

Liên hệ QC

lamvu0677

Thành viên mới
Tham gia
9/8/17
Bài viết
19
Được thích
2
Giới tính
Nam
Mình có một thắc mắc mà không biết hỏi chỗ nào,,mặc dù liên quan đến bài thì không ai thích rồi nhưng nó cũng là toán học thôi,ai giỏi chỉ mình với,, là giờ muốn tính xem có bao trường hợp được 1 điểm ,2 điểm,cho tới 10 điểm
 
Cho i,j,k nằm trong khoảng 1 đến 52. Liệt kê các trường hợp i,j,k là tổ hợp chập 3 của 52. Tạo mảng giá trị của 52 lá bài; A tới 9 cho bằng từ 1 đến 9; 10 cho bằng 0; J,Q,K cho bằng 10. Tính tổng mảng + mảng[j] + mảng[k]. Cuối cùng thống kê lại theo số điểm.
 
Cho i,j,k nằm trong khoảng 1 đến 52. Liệt kê các trường hợp i,j,k là tổ hợp chập 3 của 52. Tạo mảng giá trị của 52 lá bài; A tới 9 cho bằng từ 1 đến 9; 10 cho bằng 0; J,Q,K cho bằng 10. Tính tổng mảng + mảng[j] + mảng[k]. Cuối cùng thống kê lại theo số điểm.
Mình thử thực thi ý tưởng của bạn; Rất mong các bạn góp ý:
PHP:
Function BBBB()
 'BBBB:= Bài Bac Bát Bân    '
 Const Ro As String = "R01R02R03R04R05R06R07R08R09R10R11R12R13"
 Const Co As String = "C01C02C03C04C05C06C07C08C09C10C11C12C13"
 Const Cn As String = "N01N02N03N04N05N06N07N08N09N10N11N12N13"
 Const Bi As String = "B01B02B03B04B05B06B07B08B09B10B11B12B13"
 Dim StrC As String
 Dim J As Long, W As Long, Z As Long, Dj As Integer, Dw As Integer, Dz As Integer, Tong As Integer, F As Long
 ReDim Arr(1 To 44444, 1 To 1) As Integer
 Dim LaJ As String, LaW As String, LaZ As String
 
 StrC = Ro & Co & Cn & Bi
 For J = 1 To 52 - 2
    LaJ = Mid(StrC, 3 * J - 2, 3)
    Dj = CInt(Right(LaJ, 2))
    Dj = Diem(Dj)
    For W = J + 1 To (52 - 1)
        LaW = Mid(StrC, 3 * W - 2, 3)
        Dw = CInt(Right(LaW, 2))
        Dw = Diem(Dw)
        For Z = J + 3 To 52
            LaZ = Mid(StrC, 3 * Z - 2, 3)
            Dz = CInt(Right(LaZ, 2))
            Dz = Diem(Dz)
            Tong = Dj + Dw + Dz
            If Tong = 21 Then
                F = F + 1:            Arr(F, 1) = Tong
            End If
        Next Z
    Next W
 Next J
 MsgBox F
End Function
Mã:
Function Diem(Dm As Integer) As Integer
 If Dm < 10 Then
    Diem = Dm
 ElseIf Dm = 10 Then
    Diem = 0
 Else
    Diem = 10
 End If
End Function
 

File đính kèm

  • 30207.jpg
    30207.jpg
    54.6 KB · Đọc: 5
Rồi có kết quả chưa ạ
 
Mình thử thực thi ý tưởng của bạn; Rất mong các bạn góp ý:
PHP:
Function BBBB()
 'BBBB:= Bài Bac Bát Bân    '
 Const Ro As String = "R01R02R03R04R05R06R07R08R09R10R11R12R13"
 Const Co As String = "C01C02C03C04C05C06C07C08C09C10C11C12C13"
 Const Cn As String = "N01N02N03N04N05N06N07N08N09N10N11N12N13"
 Const Bi As String = "B01B02B03B04B05B06B07B08B09B10B11B12B13"
 Dim StrC As String
 Dim J As Long, W As Long, Z As Long, Dj As Integer, Dw As Integer, Dz As Integer, Tong As Integer, F As Long
 ReDim Arr(1 To 44444, 1 To 1) As Integer
 Dim LaJ As String, LaW As String, LaZ As String
 
 StrC = Ro & Co & Cn & Bi
 For J = 1 To 52 - 2
    LaJ = Mid(StrC, 3 * J - 2, 3)
    Dj = CInt(Right(LaJ, 2))
    Dj = Diem(Dj)
    For W = J + 1 To (52 - 1)
        LaW = Mid(StrC, 3 * W - 2, 3)
        Dw = CInt(Right(LaW, 2))
        Dw = Diem(Dw)
        For Z = J + 3 To 52
            LaZ = Mid(StrC, 3 * Z - 2, 3)
            Dz = CInt(Right(LaZ, 2))
            Dz = Diem(Dz)
            Tong = Dj + Dw + Dz
            If Tong = 21 Then
                F = F + 1:            Arr(F, 1) = Tong
            End If
        Next Z
    Next W
 Next J
 MsgBox F
End Function
Mã:
Function Diem(Dm As Integer) As Integer
 If Dm < 10 Then
    Diem = Dm
 ElseIf Dm = 10 Then
    Diem = 0
 Else
    Diem = 10
 End If
End Function
Tổng = 21 là bài xì dách rồi anh. Chỗ em bài 3 lá gọi là bài cào. Cách tính điểm là cộng điểm 3 lá lại, nếu >= 10 thì lấy phần đơn vị (10 thì lấy 0, 21 lấy 1,...) sau đó so điểm ai cao hơn là thắng. Trường hợp đặt biệt nếu cả 3 con nằm trong bộ J,Q,K (gọi là 3 tiên) thì sẽ được tính điểm cao nhất.
 
3/52 là khoảng 22 ngàn kiểu.
Với con số này thì chịu khó siêng ngồi liệt kê ra cũng được, đâu có cần "giỏi" lập trình lập trò gì.

Đặt 52 số rồi tính các kiểu bốc 3 số.
Dùng ((x-1) mod 13) + 1 để chuyển các trị về 1-13. Sau đó cộng điểm các số lại; 10, 11, 12, 13 tính là 0. Lấy tổng mod 10.

Sau khi có điểm thì dùng hàm Freq để lấy số lần xuất hiện.

Bài toán không khó. Chỉ là liệt kê hơi dài.

Bài cào là loại chơi hoàn toàn may rủi. Mọi người chơi đều có xác suất thắng bại hoà ngang nhau. Không có gì để suy tính tối ưu khả năng thắng của mình. Việc đếm có bao nhiêu lần bù, 1 nút, 2 nút,... hoàn toàn vô dụng.
Bài toán này có lẽ thớt hỏi để mang đi khoe trong quán nhậu.
 
Rảnh . . . .
Mã:
Sub ABC()
  Dim arr&(1 To 52), res&(1 To 10, 1 To 2), j&, j2&, j3&, d&, d2&
  For j = 1 To 52
    If j < 37 Then arr(j) = (j - 1) \ 4 + 1 Else arr(j) = 10
    If j < 11 Then res(j, 1) = j
  Next j
  For j = 1 To 50
    For j2 = j + 1 To 51
      d2 = arr(j) + arr(j2)
      For j3 = j2 + 1 To 52
        d = ((d2 + arr(j3) - 1) Mod 10) + 1
        res(d, 2) = res(d, 2) + 1
      Next j3
    Next j2
  Next j
  Range("A2").Resize(UBound(res), 2) = res
End Sub
 
3/52 là khoảng 22 ngàn kiểu.
Với con số này thì chịu khó siêng ngồi liệt kê ra cũng được, đâu có cần "giỏi" lập trình lập trò gì.

Đặt 52 số rồi tính các kiểu bốc 3 số.
Dùng ((x-1) mod 13) + 1 để chuyển các trị về 1-13. Sau đó cộng điểm các số lại; 10, 11, 12, 13 tính là 0. Lấy tổng mod 10.

Sau khi có điểm thì dùng hàm Freq để lấy số lần xuất hiện.

Bài toán không khó. Chỉ là liệt kê hơi dài.

Bài cào là loại chơi hoàn toàn may rủi. Mọi người chơi đều có xác suất thắng bại hoà ngang nhau. Không có gì để suy tính tối ưu khả năng thắng của mình. Việc đếm có bao nhiêu lần bù, 1 nút, 2 nút,... hoàn toàn vô dụng.
Bài toán này có lẽ thớt hỏi để mang đi khoe trong quán nhậu.
Có hàm nào liệt kê tổ hợp luôn không
 
Câu không có đủ chủ vị, câu hỏi không có dấu chấm hỏi. Bạn đang hỏi hay đang phát biểu? Nếu hỏi thì hỏi ai?
bác khó tính thế nhỉ
Bài đã được tự động gộp:

mình đã tính ra các tổ hợp rồi,kết quả là gần như bằng nhau,điểm lẻ là10%,chẵn 9,8%,điểm 10,bù la 10,78% mà giờ còn phần tính ra 3 chất giống nhau và 3 con liên tiếp nhau( lốc,sảnh) thì khó quá,
 

File đính kèm

  • FILE_20220206_075524_tohop.xlsb
    329.3 KB · Đọc: 5
Lần chỉnh sửa cuối:
bác khó tính thế nhỉ
tính ra 3 chất giống nhau và 3 con liên tiếp nhau( lốc,sảnh) thì khó quá,
Tùy bạn thôi. Nếu 1 câu hỏi rõ ràng là 1 câu hỏi thì sẽ có trả lời, nếu phát biểu chung chung thì không có trả lời, thí dụ như câu "khó quá" ở trên không phải câu hỏi.
 
Bài cào là loại chơi hoàn toàn may rủi. Mọi người chơi đều có xác suất thắng bại hoà ngang nhau. Không có gì để suy tính tối ưu khả năng thắng của mình.. . . . .
Đó là bạn chưa sành ăn gian đó thôi; Đã là cờ bạc thì phải có ăn gian, nên có câu cờ gian bạc lận mà!
Ai biết cách nào ăn gian trong bài cào nên kể ra đây để các ngài mê đỏ đen tránh xa chiếu bạc dùm cái!

$$$$@ /-(A, HA, Ha, ha, a,. . . . . .
 
Đó là bạn chưa sành ăn gian đó thôi; Đã là cờ bạc thì phải có ăn gian, nên có câu cờ gian bạc lận mà!
Ai biết cách nào ăn gian trong bài cào nên kể ra đây để các ngài mê đỏ đen tránh xa chiếu bạc dùm cái!

$$$$@ /-(A, HA, Ha, ha, a,. . . . . .
Kim Chung, Đại Thế Giới, Chợ Cũ SG (chợ chó mèo), Nguyễn Công Trứ, ... Các nơi họp mặt của dân đổ bác Sài Thành, không xa lạ gì với tôi.

Bài cào chỉ có thể gian bằng cách tráo bài, chia bài đổi chỗ, lận lá, ...
Tất cả các trò gian ấy đều là ĐỘNG TÁC TAY CHÂN, không liên quan gì đến TÍNH TOÁN BẰNG NÃO.

Khác với các trò bài khác như Xập Xám Chướng. Trò này người đánh giỏi có khả năng nâng cao xác suất thắng của mình.

Tôi khẳng định lại: kết quả của bài cào là 100% xác suất may rủi, không có cách tính toán nào cả.

Thật ra, do thớt gọi sai chứ bài cào là bài cào. Từ "cào" tượng trưng cho hành động cào tiền trong chiếu. Cứ dở bài nút cao là ăn. Và bài cào không có 10 điểm như thớt nêu ở bài #1. Ngoài 1-9, nếu không phải 3 kẹ (3 tây) thì là bù, 0 điểm, thua hết. Nói cách khác, hai con Tây và 1 con 10 là bù, thua hết. Chỉ bài "ngầu" (5 lá) mới có 10 điểm. Ngay cả bài sì dách (2 lá và rút thêm) cũng không ai dừng ở 10 tuổi.

Cái tên "bài ba lá" là để gọi loại bài chỉ vỏn vẹn có 3 lá, thường là một con đầm cơ (Queen of Hearts) và 2 lá bảy bích, bảy chuồn (Seven of Spades, Seven of Clubs). Bên nhà cái dùng tay chuyển đổi vị trí (swap positions) các lá bài. Bên nhà con xác định vị trí con đầm và đánh vào đó. Bài này là chúa của gian lận, cò mồi và giựt dọc.
 
Tán đủ rồi. Bi giờ tôi phân tích bài này cho các bạn trẻ làm quen với tính chất phân tích dữ liệu của Excel.

Phân tích sơ khởi:
(i) Bài có 52 lá. Bài cào là tổ hợp 3/52. Dùng hàm Combin thì tính ra được có tất cả 22100 tổ hợp.
(ii) Loại dữ liệu này là dữ liệu cứng: 52 lá bài luôn luon là 52 lá, không thay đổi. Tuy có đến trên 20 ngàn kiểu nhưng cũng là cứng vì chúng không thay đổi.

Phân tích dữ liệu cứng khác với dữ liệu mềm (có thể thay đổi) như thế nào?
Với dữ liệu cứng, ta biết là chỉ cần làm 1 lần, không phải lặp lại. Và các code VBA, các hàm có thể thiết lập càng giản dị càng tốt.

Giải thuật:
1. liệt kê các tổ hợp 3 của 1 đến 52 (tượng trưng cho 52 lá bài) lên bảng tính. Được 3 cột A, B, C.
2. dùng hàm chuyển lá bài thành trị của chúng. Dùng MOD để chuyển các lá 14-52 thành trị 1-13. Các lá Tây mang trị 11-13. Kết quả ở 3 cột D, E, F
3. dùng hàm tính giá trị "cào" của D+E+F. Ba kẹ là -1, các trị khác MOD cho 10.
4. dùng pivot table, hoặc countif, hoặc Freq để tính thống kê.

Các bước trên đơcj thực hiện như sau:

1. Dùng code sau:
' Lưu ý: tổ hợp có giải thuật tính của chúng
' nhưng ở trên đã phân tích, đây là dữ liệu cứng.
' và chỉ cần tính 1 lần cho nên viết code quấy quá cho xong
' tổ hợp chập 3 cho nên dùng phép vét cạn khá hiệu quả
Sub t()
Dim a()
ReDim a(1 To Application.Combin(52, 3), 1 To 3)
n = 0
For i = 1 To 52 - 2
For j = i + 1 To 52 - 1
For k = j + 1 To 52
n = n + 1
a(n, 1) = i
a(n, 2) = j
a(n, 3) = k
Next k
Next j
Next i
[a1].Resize(UBound(a), UBound(a, 2)) = a
End Sub

2. Chèn thêm dòng tiêu đề trên cùng (dòng 1), và đặt công thức cột D (kéo sang cột E, F)

1644209987940.png


3. Tạo cột TVal, tính giá trị cào:

1644210149592.png

4. Pivot Table thống kê:

1644210710221.png
 
Web KT

Bài viết mới nhất

Back
Top Bottom