Pergunta

Eu tenho considerado uma avaliação de mão rápida de poker em Python. Ocorreu -me que uma maneira de acelerar o processo seria representar todos os rostos e ternos do cartão como números primos e multipliná -los para representar as mãos. Para Whit:

class PokerCard:
    faces = '23456789TJQKA'
    suits = 'cdhs'
    facePrimes = [11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 53, 59, 61]
    suitPrimes = [2, 3, 5, 7]

E

    def HashVal(self):
      return PokerCard.facePrimes[self.cardFace] * PokerCard.suitPrimes[self.cardSuit]

Isso daria a cada mão um valor numérico que, através do Modulo, poderia me dizer quantos reis estão na mão ou quantos corações. Por exemplo, qualquer mão com cinco ou mais clubes se dividiria uniformemente por 2^5; Qualquer mão com quatro reis se dividiria uniformemente por 59^4, etc.

O problema é que uma mão de sete cartas como Acimahaskdkhks tem um valor de hash de aproximadamente 62,7 quadrilhões, o que levaria consideravelmente mais de 32 bits para representar internamente. Existe uma maneira de armazenar números tão grandes no Python que me permitirá executar operações aritméticas nele?

Foi útil?

Solução

O Python suporta um tipo inteiro "bignum" que pode funcionar com números arbitrariamente grandes. No Python 2.5+, esse tipo é chamado long e é separado do int Tipo, mas o intérprete usará automaticamente o que for mais apropriado. No python 3.0+, o int O tipo foi descartado completamente.

No entanto, esse é apenas um detalhe da implementação-desde que você tenha a versão 2.5 ou melhor, basta executar operações matemáticas padrão e qualquer número que exceda os limites de matemática de 32 bits serão automaticamente (e transparentemente) convertidos em um bignum.

Você pode encontrar todos os detalhes sangrentos em PEP 0237.

Outras dicas

Suportes para Python arbitrariamente ampla Inteiros naturalmente:

exemplo:

>>> 10**1000 100000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000

Você pode até obter, por exemplo, de um enorme valor inteiro, FIB (4000000).

Mas ainda assim faz não (por enquanto) suporta um arbitrariamente grande flutuador !!

Se você precisar de um flutuador grande e grande, verifique o módulo decimal. Existem exemplos de uso nesses foruns: OverflowerRor: (34, 'resultado muito grande')

Outra referência: http://docs.python.org/2/library/decimal.html

Você pode até usar o módulo GMPY se precisar de uma aceleração (que provavelmente será do seu interesse): Lidar com grandes números no código

Outra referência: https://code.google.com/p/gmpy/

Você pode fazer isso por diversão, mas fora isso, não é uma boa ideia. Não aceitaria nada em que eu possa pensar.

  • Colocar os cartões em uma mão será uma operação de fatoração inteira que é muito mais cara do que apenas acessar uma matriz.

  • Adicionar cartões seriam multiplicação e removendo a divisão de cartões, ambos grandes números de várias palavras, que são operações mais caras do que adicionar ou remover elementos das listas.

  • O valor numérico real de uma mão não lhe dirá nada. Você precisará levar em consideração os primos e seguir as regras do poker para comparar duas mãos. H1 <H2 Por essas mãos não significa nada.

O Python suporta números inteiros arbitrariamente grandes naturalmente:

In [1]: 59**3*61**4*2*3*5*7*3*5*7
Out[1]: 62702371781194950
In [2]: _ % 61**4
Out[2]: 0
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top