What can be done to improve my counting function?

Asked

Viewed 77 times

0

I have this program that simulates games of a mega "lottery" style. It works normal, but I would like to improve my 'count' function to present all the repeated values of each number within each game.

For example: For a total of 100 games I got a total of x numbers 1, y numbers 2 and so on for all 60 numbers.

I did the coding in a childish way and would like help to improve it by removing the exaggerated repetitions and leaving the code cleaner.

from random import randint

class Megasena(object):
    def __init__(self):
        self.quantidade_jogos = int(input(print('Quantos jogos deseja fazer ? : ')))
        self.todos_jogos = []

    def cria_jogo(self):
        x = 0
        while not x == self.quantidade_jogos:
            self.jogo = []
            for numeros in range(5):
                numeros = randint(1,60)
                if numeros not in  self.jogo:
                    self.jogo.append(numeros)
                    if len(self.jogo) == 5:
                        x += 1
                        #print(f'Jogo {x} = {self.jogo}')
                        self.todos_jogos.append(self.jogo)
        print(self.todos_jogos)
        return self.todos_jogos

    def contagem(self):
        self.todos_jogos = self.cria_jogo()
        numero1 = numero2 = numero3 = numero4 = numero5 = numero6 = numero7 = numero8 = numero9 = numero10 = 0

        for jogos in self.todos_jogos:
            numero1 += jogos.count(1)
            numero2 += jogos.count(2)
            numero3 += jogos.count(3)
            numero4 += jogos.count(4)
            numero5 += jogos.count(5)
            numero6 += jogos.count(6)
            numero7 += jogos.count(7)
            numero8 += jogos.count(8)
            numero9 += jogos.count(9)
            numero10 += jogos.count(10)


        print(f'A quantide de números 1 foi {numero1} \n'
              f'A quantide de números 2 foi {numero2} \n'
              f'A quantide de números 3 foi {numero3} \n'
              f'A quantide de números 4 foi {numero4} \n'
              f'A quantide de números 5 foi {numero5} \n'
              f'A quantide de números 6 foi {numero6} \n'
              f'A quantide de números 7 foi {numero7} \n'
              f'A quantide de números 8 foi {numero8} \n'
              f'A quantide de números 9 foi {numero9} \n'
              f'A quantide de números 10 foi {numero10} \n'
              )
        print(f'Para um total de {len(self.todos_jogos)} jogos')

Megasena().contagem()

2 answers

2

Its counting method is basically an algorithm for calculating histogram, which is able to calculate the frequency at which each number repeats into a set of numbers.

The standard library numpy has a function called numpy.histogram(), that is able to compute histograms with great efficiency.

Another relevant tip is the low efficiency of the dozens draw algorithm in which you use a technique of força bruta to avoid raffling repeated tens on the same bet.

The draw of tens can be done very elegantly and efficiently with the function random.sample().

Look how your class could look:

from random import sample
import numpy as np

class Megasena:
    def __init__(self, njogos):
        self.nbolinhas = 60
        self.ndezenas = 6
        self.njogos = njogos
        self.criar_jogos()

    def criar_jogos(self):
        self.jogos = [sample(range(1, self.nbolinhas + 1), self.ndezenas)
            for n in range(self.njogos)]
        return self.jogos

    def contagem(self):
        hist, _ = np.histogram([dezena for dezena in
            [jogo for jogo in self.jogos]], range(1,self.nbolinhas+2))
        return [(i,h) for i, h in enumerate(hist[1:],1)]

    def exibir_jogos(self):
        for i, jogo in enumerate(self.jogos,1):
            print(f'{i}. {sorted(jogo)}')

    def exibir_contagem(self):
        for dezena, frequencia in m.contagem():
            print(f'A quantide de números {dezena} foi {frequencia}')
        print(f'Para um total de {self.njogos} jogos.')


m = Megasena(int(input('Quantos jogos deseja fazer? ')))
m.exibir_jogos()
m.exibir_contagem()

Possible Exit:

Quantos jogos deseja fazer? 10
1. [6, 17, 23, 40, 49, 56]
2. [20, 24, 31, 44, 50, 57]
3. [27, 30, 37, 52, 57, 60]
4. [5, 25, 32, 35, 47, 58]
5. [19, 20, 22, 26, 32, 33]
6. [8, 10, 21, 33, 45, 53]
7. [13, 20, 26, 34, 44, 58]
8. [9, 23, 27, 32, 48, 60]
9. [4, 6, 24, 40, 48, 54]
10. [9, 16, 18, 25, 30, 37]
A quantide de números 1 foi 0
A quantide de números 2 foi 0
A quantide de números 3 foi 0
A quantide de números 4 foi 1
A quantide de números 5 foi 1
A quantide de números 6 foi 2
A quantide de números 7 foi 0
A quantide de números 8 foi 1
A quantide de números 9 foi 2
A quantide de números 10 foi 1
A quantide de números 11 foi 0
A quantide de números 12 foi 0
A quantide de números 13 foi 1
A quantide de números 14 foi 0
A quantide de números 15 foi 0
A quantide de números 16 foi 1
A quantide de números 17 foi 1
A quantide de números 18 foi 1
A quantide de números 19 foi 1
A quantide de números 20 foi 3
A quantide de números 21 foi 1
A quantide de números 22 foi 1
A quantide de números 23 foi 2
A quantide de números 24 foi 2
A quantide de números 25 foi 2
A quantide de números 26 foi 2
A quantide de números 27 foi 2
A quantide de números 28 foi 0
A quantide de números 29 foi 0
A quantide de números 30 foi 2
A quantide de números 31 foi 1
A quantide de números 32 foi 3
A quantide de números 33 foi 2
A quantide de números 34 foi 1
A quantide de números 35 foi 1
A quantide de números 36 foi 0
A quantide de números 37 foi 2
A quantide de números 38 foi 0
A quantide de números 39 foi 0
A quantide de números 40 foi 2
A quantide de números 41 foi 0
A quantide de números 42 foi 0
A quantide de números 43 foi 0
A quantide de números 44 foi 2
A quantide de números 45 foi 1
A quantide de números 46 foi 0
A quantide de números 47 foi 1
A quantide de números 48 foi 2
A quantide de números 49 foi 1
A quantide de números 50 foi 1
A quantide de números 51 foi 0
A quantide de números 52 foi 1
A quantide de números 53 foi 1
A quantide de números 54 foi 1
A quantide de números 55 foi 0
A quantide de números 56 foi 1
A quantide de números 57 foi 2
A quantide de números 58 foi 2
A quantide de números 59 foi 0
A quantide de números 60 foi 2
Para um total de 10 jogos.

See working on Repl.it

  • Thank you so much for your attention, that way you made it much more sophisticated !

1

In relation to your method countdown you could work with a Mapping of numbers from 1 to 60 in relation to your counters, IE, basically what I’m talking about is that you could create a dictionary of numbers that can be drawn as key, and the accountant as the value, for example, your method would look like this:

def contagem_alt(self):
        self.todos_jogos = self.cria_jogo()
        mapping = {n:0 for n in range(1,61)}
        for jogo in self.todos_jogos:
            for number in jogo:
                mapping[number]+=1

        return mapping

For the creation of the dictionary I used a Dictionary comprehension, If you still don’t know can take a look here: https://www.datacamp.com/community/tutorials/python-dictionary-comprehension

Also, for every game I’m accessing on self.all of the games, I make one more loop that goes through the numbers drawn from that game, so I can directly associate it with the value key dictionary.

At the end of the method I just returned the Mapping, but if you want to already print directly, just make a loop under the dictionary and ready.

Obs: The input() function already takes as argument a string that it will print on the screen the moment it is called, so you should not do the print() within the input, and yes: input ('How many games do you want to play:')

I hope I’ve helped!

  • Thanks for the attention , I did not know that I could do this way , will help me with other programs also.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.