Simulator Taruhan Martingale

Sep 16 2020

Script mensimulasikan strategi taruhan Martingale bertaruh jumlah tetap sampai terjadi kerugian, di mana petaruh menggandakan taruhan untuk mengganti kerugian. Ini berlanjut sampai kemenangan terjadi. Setelah menang, taruhan di-reset ke nilai taruhan semula. Saya menetapkan peluang untuk meniru Blackjack (peluang menang 49%). Sederhananya, jumlah menang atau kalah dalam satu putaran sama dengan taruhan. Simulasi berakhir ketika jumlah putaran yang ditentukan telah berlalu, ukuran taruhan berikutnya lebih besar dari dana yang tersedia saat ini, dana yang tersedia mencapai 0, atau keuntungan sasaran terpenuhi.

Saya baru mengenal Python dan pengkodean secara umum, jadi umpan balik apa pun akan dihargai.

import random


class MartGame:
    def __init__(self, bet=25, starting_funds=5000, goal_profit=1000, round_n=0, rng_v=0.00,
                 wins=0, losses=0, loss_run=0, win_run=0):
        self.bet = bet
        self.starting_funds = starting_funds
        self.goal_profit = goal_profit
        self.round_n = round_n
        self.rng_v = rng_v
        self.wins = wins
        self.losses = losses
        self.los_run = loss_run
        self.win_run = win_run
        self.original_bet = bet
        self.current_funds = self.starting_funds

    def rng(self):
        """Generates random number"""
        self.rng_v = random.random()

    def winloss_generator(self):
        """Generates win/loss condition"""
        if self.rng_v <= .49:
            return 'win'
        else:
            return 'loss'

    def increase_winloss(self):
        """Increases wins or losses variable based on winloss_generator output"""
        if self.winloss_generator() == 'win':
            self.wins += 1
            return 'win'
        elif self.winloss_generator() == 'loss':
            self.losses += 1
            return 'loss'
        else:
            print('error')

    def increase_round(self):
        """Increases round number by 1"""
        self.round_n += 1

    def change_current_funds(self):
        """Increases or decreases current_funds based on winloss_generator output"""
        if self.winloss_generator() == 'win':
            self.current_funds += self.bet
        elif self.winloss_generator() == 'loss':
            self.current_funds -= self.bet
        else:
            print('error')

    def change_bet(self):
        """If outcome is a win, bet is reset to original value. If outcome is a loss bet is doubled"""
        if self.winloss_generator() == 'win':
            self.bet = self.original_bet
        elif self.winloss_generator() == 'loss':
            self.bet = self.bet * 2

    def running_profit(self):
        """Returns running profit"""
        return self.current_funds - self.starting_funds

    def current_funds(self):
        """Returns running total of funds"""
        return self.current_funds

    def print_current_record(self):
        """Prints current win/loss record to screen"""
        print('Current Record: ', self.wins, 'wins, ', self.losses, 'losses')

    def print_winloss(self):
        """Prints win/loss condition to screen"""
        print(self.winloss_generator())

    def print_profit(self):
        """Prints running profit to screen"""
        print(self.running_profit(), 'running_profit'.upper())

    def print_running_total(self):
        """Prints running total to the screen"""
        print(self.current_funds, 'current funds'.upper())

    def print_round(self):
        """Prints current round"""
        print('Round:', self.round_n)

    def print_current_bet(self):
        """Prints current bet"""
        print('Bet:', self.bet)

    def run(self, rounds, each=False):
        """Runs simulation for specified number of rounds. 'each' argument indicates
        whether each round should be displayed. False will only display the final results"""
        while self.running_profit() < self.goal_profit and \
                self.round_n < rounds and self.current_funds > 0 \
                and self.current_funds > self.bet:
            self.increase_round()
            self.rng()
            self.winloss_generator()
            self.increase_winloss()
            self.change_current_funds()
            if each is True:
                self.print_round()
                self.print_current_bet()
                self.print_winloss()
                self.print_running_total()
                self.print_profit()
                self.print_current_record()
                print()
            self.change_bet()
        print()
        self.end_script()

    def end_script(self):
        """Prints final outcome of the simulation and summary of the results"""
        if self.running_profit() == self.goal_profit:
            print('YOU WIN!')
        else:
            print('YOU LOSE')
        print("Total Rounds:", self.round_n)
        print('Win/Loss Record: ', self.wins, 'Wins', self.losses, 'Losses')
        print('Ending Funds:', self.current_funds)
        print('Goal Profit:', self.goal_profit)
        print("Ending Profit:", self.running_profit())


inst = MartGame(25, 5000, 1000)

inst.run(1000, True)
```

Jawaban

2 user985366 Sep 16 2020 at 03:51

Kelas berguna saat Anda ingin membuat lebih dari satu objek dari kelas yang sama, atau membuat dan menghancurkan objek saat berjalan. Dalam hal ini, Anda hanya memiliki satu objek.

Ini bukan jenis program di mana Anda membutuhkan kelas. Jika Anda tidak menggunakan kelas, Anda dapat memiliki program yang sama persis tetapi menghapus semua self.kode Anda, yang membuatnya lebih pendek dan lebih mudah untuk membaca dan menulis.

Semua ini juga tidak diperlukan (ketika Anda tidak menggunakan kelas) karena variabel hanya akan menjadi global dalam skrip, atau lokal dalam main()fungsi Anda jika Anda memilikinya.

    self.bet = bet
    self.starting_funds = starting_funds
    self.goal_profit = goal_profit
    self.round_n = round_n
    self.rng_v = rng_v
    self.wins = wins
    self.losses = losses
    self.los_run = loss_run
    self.win_run = win_run
    self.original_bet = bet
    self.current_funds = self.starting_funds

Fungsi di bawah ini juga tidak ada artinya, apakah Anda menggunakan kelas atau tidak. Ini hanya digunakan di satu tempat dalam kode, jadi akan menghemat baris kode dan kekuatan otak bagi pengembang untuk hanya menaikkan variabel secara langsung di satu tempat itu, tidak melakukannya melalui fungsi.

def increase_round(self):
    """Increases round number by 1"""
    self.round_n += 1

Fungsi di bawah ini bahkan lebih tidak berguna. Itu bahkan tidak dipanggil karena Anda (dengan benar) merujuk variabel secara langsung di mana digunakan. Ini juga memiliki nama yang sama dengan variabel current_funds, yang mungkin menimbulkan masalah.

def current_funds(self):
    """Returns running total of funds"""
    return self.current_funds

Di bawah ini terlihat aneh. Mengapa Anda tidak mencetak saja 'RUNNING_PROFIT'?

'running_profit'.upper()