from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import random #doc = """収入とリスク資産への投資割合の関係性をみる実験""" class Constants(BaseConstants): name_in_url = 'my_invest1' players_per_group = None num_rounds = 3 instructions_template = 'my_invest1/instructions.html' AtariA=[8000,7500,7000] HazureA=[550,600,650] AtariB=[1500,1600,1550] HazureB=[800,750,850] KakurituA=[0.9,0.85,0.8] KakurituB=[0.6,0.65,0.55] class Subsession(BaseSubsession): def creating_session(self): for p in self.get_players(): rondom_listA = [] rondom_listB = [] for k in range(5): x = round(random.uniform(0,1),3) y = round(random.uniform(0,1),3) rondom_listA.append(x) rondom_listB.append(y) p.ransuu_A=str(rondom_listA) p.ransuu_B=str(rondom_listB) p.cash=p.id_in_subsession % 2 p.income=5000 class Group(BaseGroup): pass class Player(BasePlayer): income = models.IntegerField() bond = models.FloatField() stock = models.FloatField() investment_gain = models.IntegerField() total_payment = models.IntegerField() basic_income = models.IntegerField() total_payoff = models.IntegerField() real_gain = models.FloatField() Answer=models.IntegerField() ransuu_A=models.StringField() ransuu_B=models.StringField() Choice_A=models.IntegerField(label="くじA") # Aくじを買った数 Choice_B=models.IntegerField(label="くじB") # Bくじを買った数 Gain_A=models.IntegerField(initial=0) Gain_B=models.IntegerField(initial=0) CAtari_A=models.IntegerField() # Aくじが当たった時の今期のGain CAtari_B=models.IntegerField() # Bくじが当たった時の今期のGain CHazure_A=models.IntegerField() # Aくじがはずれた時の今期のGain CHazure_B=models.IntegerField() # Bくじがはずれた時の今期のGain Bairitsu_A=models.IntegerField() Bairitsu_B=models.IntegerField() CKakuritu_A=models.FloatField() # 今季Aくじが当たる確率 CKakuritu_B=models.FloatField() # 今季Bくじが当たる確率 Atari_num_A=models.IntegerField() # 今季Aくじが当たった枚数 Atari_num_B=models.IntegerField() # 今季Bくじが当たった枚数 cash=models.BooleanField() invest_bond = models.FloatField( label='' 'くじAへの投資金額を入力してください' '', min=0) def invest_bond_max(self): return self.income invest_stock = models.FloatField( label='' 'くじBへの投資金額を入力してください' '', min=0) def invest_stock_max(self): return self.income def final_payment(self): self.basic_income = self.income * Constants.num_rounds def set_payoffs(self): self.total_payment = self.total_payment def Atarikuji(self): self.CAtari_A=Constants.AtariA[self.round_number-1] self.CHazure_A=Constants.HazureA[self.round_number-1] self.CAtari_B=Constants.AtariB[self.round_number-1] self.CHazure_B=Constants.HazureB[self.round_number-1] self.CKakuritu_A=Constants.KakurituA[self.round_number-1] self.CKakuritu_B=Constants.KakurituB[self.round_number-1] def kujibiki(self): #各くじごとに異なる確率判定が行われるバージョン if self.Choice_A == 0: #Line121のコマンドが、くじを1枚も買わないときにはうまく動かなかったので、それだけ別に計算する。 self.Atari_num_A = 0 else: self.Atari_num_A = sum(i >= self.CKakuritu_A for i in eval(self.ransuu_A)[0:self.Choice_A]) #乱数のベクトルの内、買った数分だけ取り出して、それぞれ当たりかどうかを判定し、あたりの数を合計するコマンド if self.Choice_B == 0: self.Atari_num_B = 0 else: self.Atari_num_B = sum(i >= self.CKakuritu_B for i in eval(self.ransuu_B)[0:self.Choice_B]) self.Gain_A = self.CHazure_A*(self.Choice_A - self.Atari_num_A) + self.CAtari_A*self.Atari_num_A self.Gain_B = self.CHazure_B*(self.Choice_B - self.Atari_num_B) + self.CAtari_B*self.Atari_num_B self.total_payment=5000-(self.Choice_A + self.Choice_B)*1000 + self.Gain_A + self.Gain_B """ 独立じゃないバージョン if self.CKakuritu_A>=self.ransuu_A: self.Gain_A=self.CHazure_A*self.Choice_A self.Bairitsu_A=self.CHazure_A else: self.Gain_A=self.CAtari_A*self.Choice_A self.Bairitsu_A=self.CAtari_A if self.CKakuritu_B>=self.ransuu_B: self.Gain_B=self.CHazure_B*self.Choice_B self.Bairitsu_B=self.CHazure_B else: self.Gain_B=self.CAtari_B*self.Choice_B self.Bairitsu_B=self.CAtari_B self.total_payment=5000-self.Choice_A*1000-self.Choice_B*1000+self.Gain_A+self.Gain_B """