Esempio n. 1
0
    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()
Esempio n. 2
0
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