Martingale Betting Simulator 2.0
Đây là bước thứ hai trong việc tạo mô phỏng cá cược Martingale. Mã ban đầu cần tái cấu trúc nặng đến mức tôi chỉ bắt đầu từ đầu.
Script mô phỏng chiến lược cá cược Martingale đặt cược một số tiền cố định cho đến khi xảy ra thua lỗ, lúc này số tiền đặt cược sẽ được nhân đôi để bù vào số tiền thua. Việc này tiếp tục cho đến khi thắng, sau khi thắng, cược sẽ được đặt lại về giá trị cược ban đầu. Tôi đặt tỷ lệ cược để bắt chước trò Blackjack (49% cơ hội thắng). Vì đơn giản, số tiền thắng hoặc thua trong một vòng bằng tiền cược. Mô phỏng kết thúc khi số vòng được chỉ định trôi qua, quy mô của lần đặt cược tiếp theo lớn hơn số tiền hiện có, số tiền khả dụng đạt 0 hoặc đạt được lợi nhuận mục tiêu.
Tôi là thương hiệu mới đối với Python và viết mã nói chung, vì vậy mọi phản hồi sẽ được đánh giá cao.
import random
def main(rounds=10, bet=25, goal_profit=1000, each=False, end_script_prt=True):
"""Runs a simulation of the Martingale betting strategy over a specified number of rounds.
each = True will print a summary of each round's results. end_script_prt = True will
print a summary of the game's results"""
original_bet = bet
current_bet = bet
starting_funds = 5000
current_profit = 0
current_funds = starting_funds
round_n = 0
wins = 0
losses = 0
while current_profit < goal_profit\
and round_n < rounds\
and current_funds > 0\
and current_funds > current_bet:
round_n += 1
rng_v = rng()
current_funds += change_current_funds(current_bet, rng_v)
current_profit = current_profits(current_funds, starting_funds)
if winloss_generator(rng_v) == 'win':
wins += 1
elif winloss_generator(rng_v) == 'loss':
losses += 1
if each:
print('ROUND:', round_n, 'of', rounds)
print('BET:', current_bet)
print('OUTCOME:', winloss_generator(rng_v).capitalize())
print('WINS/LOSSES:', wins, 'Wins', losses, 'losses')
print('CURRENT FUNDS:', current_funds)
print('CURRENT PROFIT:', current_profit)
print()
current_bet = change_bet(original_bet, current_bet, rng_v)
print()
if end_script_prt:
end_script(round_n, wins, losses, starting_funds, current_funds, goal_profit, current_profit)
return change_iterated_winloss(current_profit, goal_profit)
def rng():
"""Returns random number"""
return random.random()
def winloss_generator(rng_v):
"""Returns win/loss condition"""
if rng_v <= .49:
return 'win'
if rng_v > .49:
return 'loss'
def change_current_funds(current_bet, rng_v):
"""Returns change in funds resulting from round outcome"""
if winloss_generator(rng_v) == 'win':
return current_bet
if winloss_generator(rng_v) == 'loss':
return current_bet * -1
def change_bet(original_bet, current_bet, rng_v):
"""Returns updated bet value
If outcome is a win, bet is reset to original value. If outcome is a loss bet is doubled"""
if winloss_generator(rng_v) == 'win':
return original_bet
if winloss_generator(rng_v) == 'loss':
return current_bet * 2
def current_profits(current_funds, starting_funds):
"""Returns current profit"""
return current_funds - starting_funds
def end_script(round_n, wins, losses, starting_funds, current_funds, goal_profit, current_profit):
"""Prints final outcome of the game and summary of the results"""
print('*************************')
if current_profit >= goal_profit:
print('YOU WIN!')
else:
print('YOU LOSE')
print('TOTAL ROUNDS:', round_n)
print('WIN/LOSS RECORD:', wins, 'Wins', losses, 'Losses')
print('STARTING FUNDS:', starting_funds)
print('ENDING FUNDS: ', current_funds)
print('GOAL PROFIT:', goal_profit)
print('ENDING PROFIT:', current_profit)
def change_iterated_winloss(current_profit, goal_profit):
"""Returns game's win/loss outcome as a string"""
if current_profit >= goal_profit:
w_l = 'w'
return w_l
else:
w_l = 'l'
return w_l
def iterated_winloss_count(iterations, each=False):
"""Returns a summary of the total win/loss record across game iterations. each = True will
print each game result individually"""
total_wins = 0
total_losses = 0
for x in range(iterations):
game_outcome = main(1000, 25, 5000, False, False)
if game_outcome == 'w':
total_wins += 1
if each:
print('WIN!')
if game_outcome == 'l':
total_losses += 1
if each:
print('LOSS')
print()
print('WINS/LOSSES OVER', iterations, 'ITERATIONS:', total_wins, 'Wins', total_losses, 'Losses')
# Single Game
if True:
main(1000, 25, 5000, True, True)
# Iterated Games
if False:
iterated_winloss_count(1000, False)
Trả lời
Bạn có một vài hàm có cấu trúc điều kiện khác thường. Tôi có thể hiểu nhầm điều gì đó, nhưng tôi cho rằng người chơi thắng hoặc thua. Trong ánh sáng đó, không có mục đích cho việc kiểm tra điều kiện thứ hai: chỉ sử dụng else.
def winloss_generator(rng_v):
if rng_v <= .49: # win
return 'win'
if rng_v > .49: # else loss
return 'loss'
Đó không phải là vấn đề phổ biến nhất đối với những người đang học, nhưng về cơ bản bạn đã tính toán quá mức thực tế, khiến một điều đơn giản trở nên khó hiểu. Một số ngẫu nhiên được tạo ra, và nó sẽ xác định thắng / thua (nhưng chúng tôi không nhớ kết quả); sau đó số ngẫu nhiên đó dệt theo cách của nó qua nhiều bước, mỗi bước trong số chúng gọi winloss_generator(RANDOM_NUM), cho chúng ta biết (một lần nữa) đó là thắng hay thua. Thay vào đó, trực tiếp vào main(), chỉ cần xác định kết quả ngay lập tức.
won = (random.random() <= .49)
Với biến đó được ghi nhớ, phần còn lại của các phép tính sẽ dễ dàng hiểu tất cả ở một nơi. Khi các phép tính khá đơn giản, có liên quan chặt chẽ và dễ theo dõi như một nhóm, hãy giữ chúng lại với nhau như một quy tắc chung:
current_funds += current_bet * (1 if won else -1)
current_profit = current_funds - starting_funds
wins += int(won)
losses += int(not won)
...
current_bet = original_bet if won else 2 * current_bet
Ngoài việc tính toán quá nhiều yếu tố, bạn đã kiểm tra mã dưới góc độ của các hiệu ứng phụ (in là tác dụng phụ ở đây). Ý tưởng chung là loại bỏ các tác dụng phụ trong lớp ngoài mỏng của chương trình. Phần còn lại của mã sau đó có thể hoạt động thuần túy trong lĩnh vực chức năng trả về dữ liệu (ít nhất đó là hy vọng; thực tế có đặt ra thách thức). Đây là một cách mã của bạn có thể được cấu trúc lại để áp đặt sự tách biệt đó.
from collections import namedtuple
# A simple data object to store all relevant details
# for one round of play.
Round = namedtuple('Round', 'round_n won funds profit wins losses bet')
# Entry point.
def main():
# Run the rounds and get data back. No printing yet.
rounds = list(martingale(200, 25, 5000))
# Analyze the results as much as we like.
for r in rounds:
...
# Report the results. Printing OK here.
for r in rounds:
print(...)
# The algorithmic code of the betting strategy.
# It sticks fairly close to your original code, absent side effects.
def martingale(rounds=10, bet=25, goal_profit=1000):
funds = 5000
orig_bet = bet
orig_funds = funds
profit = 0
round_n = 0
wins = 0
losses = 0
while profit < goal_profit and round_n < rounds and funds > bet:
round_n += 1
won = (random.random() <= .49)
funds += bet * (1 if won else -1)
profit = funds - orig_funds
wins += int(won)
losses += int(not won)
yield Round(round_n, won, funds, profit, wins, losses, bet)
bet = orig_bet if won else 2 * bet
Thiết kế đó tốt hơn vì bạn có thể làm nhiều việc hơn với nó. Hãy tưởng tượng thêm hỗ trợ cho các đối số dòng lệnh để xác định các tham số đầu vào, cộng với các tùy chọn khác nhau cho các loại phân tích hoặc báo cáo khác nhau. Bạn có thể thêm tất cả những thứ đó mà không cần thay đổi mã thuật toán trong martingale(). Bây giờ cũng khả thi để viết một hàm khác thực hiện một chiến lược cá cược khác: nó cũng sẽ trả về roundsvà bạn có thể phân tích chúng với cùng một mã được sử dụng trên martingale(). Cuối cùng, một điều khác mà bạn có thể muốn là có thể kiểm tra một chức năng như thế này: theo kiểu tự động hoặc đặc biệt trong các phiên gỡ lỗi. Cả hai đều dễ dàng hơn nếu bạn có thể gọi hàm và lấy lại câu trả lời dưới dạng dữ liệu thay vì một đống văn bản in. Lưu bản in để sử dụng sau: trước tiên hãy lấy đúng dữ liệu.