from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random author = 'Vartanov' doc = """ Изучаем отношение к риску """ class Constants(BaseConstants): name_in_url = 'risky_business' players_per_group = None num_rounds = 14 lotteries_array = ['risky_business/Lottery1.html', 'risky_business/Lottery2.html', 'risky_business/Lottery3.html', 'risky_business/Lottery4.html', 'risky_business/Lottery5.html', 'risky_business/Lottery6.html', 'risky_business/Lottery7.html', 'risky_business/Lottery8.html', 'risky_business/Lottery9.html', 'risky_business/Lottery10.html', 'risky_business/Lottery11.html', 'risky_business/Lottery12.html', 'risky_business/Lottery13.html', 'risky_business/Lottery14.html'] class Subsession(BaseSubsession): random_outcome = models.PositiveIntegerField() a_outcomes = models.PositiveIntegerField() b_outcomes = models.PositiveIntegerField() a_expected = models.FloatField() b_expected = models.FloatField() a_payoff = models.IntegerField() b_payoff = models.IntegerField() avg_det_prob = models.IntegerField() avg_alm_prob = models.IntegerField() def creating_session(self): self.random_outcome = random.randint(1, 100) playrs = self.get_players() if self.round_number == 1: self.avg_alm_prob = 0 self.avg_det_prob = 0 for p in playrs: p.total_payoff = 0 self.a_outcomes = 3 self.a_expected = 50*33/100 + 48*66/100 if self.random_outcome <= 33: self.a_payoff = 50 elif self.random_outcome <= 99: self.a_payoff = 48 else: self.a_payoff = 0 self.b_outcomes = 1 self.b_expected = 48 self.b_payoff = 48 elif self.round_number == 2: self.a_outcomes = 2 self.a_expected = 80*80/100 if self.random_outcome <= 80: self.a_payoff = 80 else: self.a_payoff = 0 self.b_outcomes = 1 self.b_expected = 60 self.b_payoff = 60 elif self.round_number == 3: self.a_outcomes = 3 self.a_expected = 40*25/100 + 20*50/100 if self.random_outcome <= 25: self.a_payoff = 40 elif self.random_outcome <= 75: self.a_payoff = 20 else: self.a_payoff = 0 self.b_outcomes = 1 self.b_expected = 20 self.b_payoff = 20 elif self.round_number == 4: self.a_outcomes = 2 self.a_expected = 50*33/100 + 0*67/100 if self.random_outcome <= 33: self.a_payoff = 50 else: self.a_payoff = 0 self.b_outcomes = 2 self.b_expected = 48*34/100 + 0*66/100 if self.random_outcome <= 34: self.b_payoff = 48 else: self.b_payoff = 0 elif self.round_number == 5: self.a_outcomes = 2 self.a_expected = 80*(-80)/100 + 20*0/100 if self.random_outcome <= 80: self.a_payoff = -80 else: self.a_payoff = 0 self.b_outcomes = 1 self.b_expected = -60 self.b_payoff = -60 elif self.round_number == 6: self.a_outcomes = 2 self.a_expected = 80*20/100 + 0*80/100 if self.random_outcome <= 20: self.a_payoff = 80 else: self.a_payoff = 0 self.b_outcomes = 2 self.b_expected = 60*25/100 + 0*75/100 if self.random_outcome <= 25: self.b_payoff = 60 else: self.b_payoff = 0 elif self.round_number == 7: self.a_outcomes = 2 self.a_expected = 40+40*(50)/100 + 0*50/100 if self.random_outcome <= 40: self.a_payoff = 40+40 else: self.a_payoff = 40 self.b_outcomes = 1 self.b_expected = 60 self.b_payoff = 60 elif self.round_number == 8: self.a_outcomes = 3 self.a_expected = -40*25/100 - 20*50/100 if self.random_outcome <= 25: self.a_payoff = -40 elif self.random_outcome <= 75: self.a_payoff = -20 else: self.a_payoff = 0 self.b_outcomes = 1 self.b_expected = -20 self.b_payoff = -20 elif self.round_number == 9: self.a_outcomes = 2 self.a_expected = -80*20/100 - 0*80/100 if self.random_outcome <= 20: self.a_payoff = -80 else: self.a_payoff = 0 self.b_outcomes = 2 self.b_expected = -60*25/100 + 0*75/100 if self.random_outcome <= 25: self.b_payoff = -60 else: self.b_payoff = 0 elif self.round_number == 10: self.a_outcomes = 2 self.a_expected = 80 - 40*50/100 - 0*80/100 if self.random_outcome <= 50: self.a_payoff = 80 - 40 else: self.a_payoff = 80 self.b_outcomes = 1 self.b_expected = 60 self.b_payoff = 60 class Group(BaseGroup): def set_payoffs(self): playrs = self.get_players() for p in playrs: p.average_prob_det = p.participant.vars.get('avg_prob_det') p.average_prob_alm = p.participant.vars.get('avg_prob_alm') if self.subsession.round_number < Constants.num_rounds - 3: if p.decision == 'A': p.current_payoff = self.subsession.a_payoff else: p.current_payoff = self.subsession.b_payoff elif self.subsession.round_number == Constants.num_rounds - 3: curr_rand = self.subsession.random_outcome if p.decision == 'A': if curr_rand <= p.average_prob_det: p.current_payoff = 100 else: p.current_payoff = 0 else: p.current_payoff = 50 elif self.subsession.round_number == Constants.num_rounds - 2: curr_rand = self.subsession.random_outcome if p.decision == 'A': if curr_rand <= p.average_prob_alm: p.current_payoff = 100 else: p.current_payoff = 0 else: if curr_rand <= 90: p.current_payoff = 50 else: p.current_payoff = 0 elif self.subsession.round_number == Constants.num_rounds - 1: p.treshold_prob_det = p.participant.vars.get('eq_prob_det') curr_rand = self.subsession.random_outcome if p.decision == 'A': if curr_rand <= p.treshold_prob_det: p.current_payoff = 100 else: p.current_payoff = 0 else: p.current_payoff = 50 else: p.treshold_prob_alm = p.participant.vars.get('eq_prob_alm') curr_rand = self.subsession.random_outcome if p.decision == 'A': if curr_rand <= p.treshold_prob_alm: p.current_payoff = 100 else: p.current_payoff = 0 else: if curr_rand <= 90: p.current_payoff = 50 else: p.current_payoff = 0 current_round = self.subsession.round_number p.played_rounds = current_round if current_round == 1: p.total_payoff = p.current_payoff else: p_before = p.in_round(current_round-1) p.total_payoff = p_before.total_payoff + p.current_payoff p.avg_payoff = p.total_payoff / p.played_rounds p.random_outcome = self.subsession.random_outcome class Player(BasePlayer): decision = models.CharField( choices=['A', 'B'], widget=widgets.RadioSelect) treshold_prob_det = models.PositiveIntegerField() treshold_prob_alm = models.PositiveIntegerField() avg_payoff = models.FloatField() current_payoff = models.IntegerField() random_outcome = models.PositiveIntegerField() average_prob_det = models.IntegerField() average_prob_alm = models.IntegerField() total_payoff = models.IntegerField() played_rounds = models.PositiveIntegerField() phone_number = models.StringField( verbose_name="Введите в 10-значном формате без пробелов и внутренних символов (например, 9061234567)" )