def __init__(self, ruleta = 'europea', apuesta = 18, inicial = 1, funcion = ('apuesta','constante'), param = None, resto = 100 ): self._apuesta = Apuesta(ruleta=ruleta,multiplicidad=apuesta) cond = (resto >= 1) mensaje = "El resto debe ser mayor que 1" valida(cond,resto,mensaje) self._resto = resto cond = (inicial >= 1 and inicial <= self._resto) mensaje = "'inicial' debe ser mayor o igual que 1 y menor o igual que el resto(%d)"%(self._resto,) valida(cond,inicial,mensaje) self._inicial = inicial self._param = param cond = (funcion in NoVaMas.funciones) mensaje = "'funcion' debe ser una de "+repr(NoVaMas.funciones.keys()) valida(cond,funcion,mensaje) self._funcion = funcion clase,tipo = funcion params = {'inicial':self._inicial,'param':self._param,'ratio':self._apuesta.ratio} self._novamas = NoVaMas(clase,tipo,params) self._inicializa()
class Martingala(object): def __init__(self, ruleta = 'europea', apuesta = 18, inicial = 1, funcion = ('apuesta','constante'), param = None, resto = 100 ): self._apuesta = Apuesta(ruleta=ruleta,multiplicidad=apuesta) cond = (resto >= 1) mensaje = "El resto debe ser mayor que 1" valida(cond,resto,mensaje) self._resto = resto cond = (inicial >= 1 and inicial <= self._resto) mensaje = "'inicial' debe ser mayor o igual que 1 y menor o igual que el resto(%d)"%(self._resto,) valida(cond,inicial,mensaje) self._inicial = inicial self._param = param cond = (funcion in NoVaMas.funciones) mensaje = "'funcion' debe ser una de "+repr(NoVaMas.funciones.keys()) valida(cond,funcion,mensaje) self._funcion = funcion clase,tipo = funcion params = {'inicial':self._inicial,'param':self._param,'ratio':self._apuesta.ratio} self._novamas = NoVaMas(clase,tipo,params) self._inicializa() def _inicializa(self): def minmax(x,c): return x,c+x,self._apuesta.ratio*x-c def restos(x,y,z): return self._resto-x,self._resto+y,self._resto-z A,C,G,R = [],[],[],[] prbs,acum = [],[] k,c0,d=0,0,0 ruina = None while True: k += 1 a,c1,g = self._novamas(k-1,c0) if a < self._apuesta.minima: a,c1,g = minmax(self._apuesta.minima,c0) if a > self._apuesta.maxima: a,c1,g = minmax(self._apuesta.maxima,c0) r = restos(c0,g,c1) c0 = c1 p = self._apuesta.probabilidad(k) d += p prbs += [p] ; acum += [d] A += [a] ; C += [c1] ; G += [g] ; R += [r] if r[2] < 0: ruina = k-1,1-d+p break self._prbs,self._acum = prbs[:],acum[:] self._long,self._ruina = k,ruina self._Apuesta,self._Coste,self._Ganancia,self._Resto=A[:],C[:],G[:],R[:] @property def apuesta(self): return self._apuesta @property def probabilidades(self): return self._prbs @property def inicial(self): return self._inicial @inicial.setter def inicial(self,a0): cond = (a0>=1 and a0<=self._resto) mensaje = "'inicial' debe ser mayor que 1 y menor que el resto(%d)"%(self._resto,) valida(cond,a0,mensaje) self._inicial = a0 self._novamas.inicial = a0 self._inicializa() @property def resto(self): return self._resto @resto.setter def resto(self,resto): cond = (resto >= 1) mensaje = "El resto debe ser mayor que 1" valida(cond,resto,mensaje) self._resto = resto self._inicializa() @property def apuesta_maxima(self): apmx=self._apuesta.maxima imax=first(lambda x: x==apmx,self._Apuesta) return apmx,imax def racha(self,n): cond = (n>=1 and n<=self._long) mensaje = "El número de jugada debe estar entre 1 y {0} ambos incluidos".format(self._long) valida(cond,n,mensaje) n = n-1 return self._Apuesta[n],self._Coste[n],self._Ganancia[n],self._Resto[n],self._prbs[n] def ruina(self): txt="Ruina del jugador:\n" negativa=first(lambda x: x<0,self._Ganancia) if negativa is not None: txt += " Habrá pérdidas para rachas de longitud >= {0}\n".format(negativa+1) maxima=self.apuesta_maxima[1] if maxima is not None: txt += " No se puede aumentar la apuesta a partir de la tirada {0}\n".format(maxima+1) txt += " El resto será insuficiente en la tirada {0} con probabilidad = {1:.2%}\n".format(*self._ruina) return txt,maxima def __repr__(self): apuesta=self._apuesta.nombre clase,tipo=self._funcion parametro,param=self._novamas.descripcion,self._param paramdesc = "" if tipo == 'constante' else " y {0} = {1}".format(parametro,param) pago1,pago2=self._apuesta.pago textruina,maxima=self.ruina() h1,h2='='*80+'\n','-'*80+'\n' h = h1 h+= "Apuesta de tipo '{0}' con la función actuando sobre las {1}s\n" h+= "La función es de tipo {2} con apuesta inicial de {3}{4}\n" h+= "Los pagos son de {5} a {6}\n" h+= h2 H = h.format(apuesta,clase,tipo,self._inicial,paramdesc,pago1,pago2) H+= textruina H+= h1 H+= " n Apuesta Coste Ganancia Restos Probabilidad\n" H+= h1 fmt="{0: 4d} {1: 7.2f} {2: 7.2f} {3: 7.2f} ({4:6.2f} , {5:6.2f}) ({6:5.2f} , {7:5.2f}) {8}\n" T="" s = ['']*self._long media,mediana=int(self._apuesta.media),int(self._apuesta.mediana) if media == mediana: s[media-1] = "<< media(na)" else: s[media-1],s[mediana-1] = '<< media','<< mediana' if maxima is not None: s[maxima]='<< ap-maxima' r=self._ruina[0] if r >= self._long: s[-1] = 'VV ruina VV' else: s[r-1] = '<< ruina' acgpd=zip(self._Apuesta,self._Coste,self._Ganancia,self._prbs,self._acum) for k in range(self._long): r = self._Resto[k] if r[0]<0: break a,c,g,p,d = acgpd[k] T+=fmt.format(k+1,a,c,g,r[1],r[2],100*p,100*d,s[k]) T+=h1 return H+T