Hướng dẫn coin flip streaks python - đồng xu lật vệt trăn

Sau đây là một tập hợp các sửa đổi nhỏ cho mã được cung cấp ban đầu sẽ tính toán ước tính chính xác.

Tôi đã đánh dấu các sửa đổi với các bình luận được tiền tố bởi #### và đánh số chúng với tham chiếu đến các giải thích tiếp theo.

import random

#variable declaration

numberOfStreaks = 0

for experimentNumber in range[10000]:
    # Code that creates a list of 100 'heads' or 'tails' values.
    CoinFlip = [] #### [1] create a new, empty list for this list of 100
    for i in range[100]:
        CoinFlip.append[random.randint[0,1]]
    #does not matter if it is 0 or 1, H or T, peas or lentils. I am going to check if there is multiple 0 or 1 in a row        

    #### # [6] example / test
    #### # if uncommented should be 100%
    #### CoinFlip = [ 'H', 'H', 'H', 'H', 'H', 'H', 'T', 'T', 'T', 'T', 'T', 'T' ]

    # Code that checks if there is a streak of 6 heads or tails in a row.
    streak = 1 #### [2, 4] any flip is a streak of [at least] 1; reset for next check
    for i in range[1, len[CoinFlip]]: #### [3] start at the second flip, as we will look back 1
        if CoinFlip[i] == CoinFlip[i-1]:  #checks if current list item is the same as before
            streak += 1
        else:
            streak = 1 #### [2] any flip is a streak of [at least] 1

        if streak == 6:
            numberOfStreaks += 1
            break #### [5] we've found a streak in this CoinFlip list, skip to next experiment
                  #### if we don't, we get percentages above 100, e.g. the example / test above
                  #### this makes some sense, but is likely not what the book's author intends

print['Chance of streak: %s%%' % [numberOfStreaks / 100.0]]

Giải thích về những thay đổi này

Sau đây là một lời giải thích ngắn gọn về những thay đổi này. Mỗi phần lớn độc lập, khắc phục một vấn đề khác nhau với mã.

  1. Việc xóa/tạo danh sách Coinflip khi bắt đầu mỗi thử nghiệm
    • Không có điều này, các yếu tố mới được thêm vào danh sách từ thử nghiệm trước đó
  2. sự thừa nhận rằng bất kỳ lật, thậm chí một 'H' hoặc 'T' [hoặc 1 hoặc 0], đại diện cho một chuỗi là 1
    • Nếu không có thay đổi này, mã thực sự yêu cầu sáu trận đấu tiếp theo với lật đồng xu ban đầu, với tổng số bảy là bảy [một thay đổi thay thế ít trực quan hơn sẽ là thay thế if streak == 6: bằng if streak == 5:]
  3. Bắt đầu kiểm tra từ lần lật thứ hai, sử dụng range[1, len[CoinFlip]] [danh sách N.B. không được chỉ số]
    • Khi mã nhìn lại dọc theo danh sách, vòng lặp for với ####0 bắt đầu với 0 sẽ so sánh không chính xác chỉ mục 0 với index ####2 [phần tử cuối cùng của danh sách]
  4. [Di chuyển phạm vi và] Đặt lại bộ đếm ####3 trước mỗi lần kiểm tra
    • Nếu không có sự thay đổi này, một chuỗi ban đầu trong một thử nghiệm có thể được thêm vào một chuỗi một phần từ một thử nghiệm trước đó [xem kiểm tra mã cho một cuộc biểu tình được đề xuất]
  5. Thoát khỏi tấm séc khi chúng tôi đã tìm thấy một chuỗi
    • "Phần thứ hai kiểm tra xem có một vệt trong đó không" - các vệt lật đồng xu

Câu hỏi này trong cuốn sách có phần được chỉ định kém, và phần cuối cùng có thể được giải thích có nghĩa là bất kỳ "kiểm tra nào nếu [ít nhất?] Giải pháp này diễn giải kiểm tra như một đánh giá boolean [nghĩa là chúng tôi chỉ ghi lại rằng danh sách này chứa một chuỗi hoặc không có] và diễn giải một không độc hại [nghĩa là chúng tôi cho phép các chuỗi dài hơn hoặc nhiều chuỗi để đếm; được cung cấp trong câu hỏi].

[Tùy chọn 6.] Kiểm tra mãTesting the code

"Ví dụ / Thử nghiệm" được nhận xét cho phép bạn chuyển các lần lật được tạo ngẫu nhiên thông thường thành cùng một giá trị đã biết trong mỗi thử nghiệm. Trong trường hợp này, một danh sách cố định sẽ tính là 100%. Nếu bạn không đồng ý với việc giải thích đặc tả nhiệm vụ và vô hiệu hóa việc thoát khỏi séc được mô tả trong [5.], bạn có thể mong đợi chương trình sẽ báo cáo 200% vì có hai chuỗi riêng biệt của sáu trong mỗi thử nghiệm. Vô hiệu hóa ####4 kết hợp với đầu vào này báo cáo chính xác điều đó.

Bạn nên luôn luôn sử dụng loại kỹ thuật này [sử dụng đầu vào đã biết, xác minh đầu ra] để thuyết phục bản thân rằng mã không hoặc không hoạt động như nó tuyên bố hoặc như bạn mong đợi.

Đầu vào cố định ####5 có thể được sử dụng để làm nổi bật vấn đề được khắc phục bởi [4.]. Nếu được hoàn nguyên, mã sẽ tính toán tỷ lệ phần trăm của các thí nghiệm [tất cả đều có đầu vào này] chứa chuỗi sáu ####6 hoặc ####7 liên tiếp là 50%. Trong khi [5.] khắc phục một vấn đề độc lập, loại bỏ ####4 đã được thêm vào làm trầm trọng thêm lỗi và tăng tỷ lệ phần trăm được tính toán lên 99,99%. Đối với đầu vào này, tỷ lệ phần trăm được tính toán chứa chuỗi sáu nên là 0%.

Bạn sẽ tìm thấy mã hoàn chỉnh, như được cung cấp ở đây, tạo ra ước tính khoảng 80%. Điều này có thể đáng ngạc nhiên, nhưng tác giả của cuốn sách gợi ý rằng đây có thể là trường hợp:

Một con người sẽ gần như không bao giờ viết ra một chuỗi sáu đầu hoặc sáu cái đuôi liên tiếp, mặc dù điều đó rất có thể xảy ra trong những lần lật đồng xu thực sự ngẫu nhiên.

- Al Sweigart, Coin Flip Streaks

Bạn cũng có thể xem xét các nguồn bổ sung. Wolframalpha tính toán rằng cơ hội nhận được "chuỗi 6 đầu trong 100 lần lật đồng xu" là khoảng 1 trên 2. Ở đây chúng tôi ước tính cơ hội nhận được một chuỗi 6 [hoặc nhiều hơn] hoặc một chuỗi sáu [hoặc nhiều hơn] Tails, mà bạn có thể mong đợi thậm chí còn có nhiều khả năng. Như một ví dụ đơn giản, độc lập hơn về hiệu ứng tích lũy này: hãy xem xét rằng cơ hội chọn một trái tim từ một gói thẻ chơi bình thường là 13 trên 52, nhưng chọn một trái tim hoặc một viên kim cương sẽ là 26 trên 52.

Ghi chú về tính toán

Nó cũng có thể giúp hiểu rằng tác giả cũng có một lối tắt với việc tính toán tỷ lệ phần trăm. Điều này có thể nhầm lẫn người mới bắt đầu nhìn vào tính toán cuối cùng.

Nhớ lại, một tỷ lệ phần trăm được tính toán:

Chúng tôi biết rằng tổng số thí nghiệm để chạy sẽ là 10000

Vì vậy

PostScript: Tôi đã tự do thay đổi ####9 thành 'H'0 trong dòng cuối cùng. Điều này cho phép mã tính toán tỷ lệ phần trăm chính xác trong Python 2. Điều này không cần thiết cho Python 3, như được chỉ định trong câu hỏi và sách.

Bài Viết Liên Quan

Chủ Đề