0

Playground Python: o teorema do macaco infinito

Luciano Borges
Luciano Borges

teorema do macaco infinito é um exercício abstrato de matemática, no campo dos grandes números e da probabilidade. Curiosamente, a primeira vez que me deparei com o problema foi ainda na infância: há uma representação do problema em A história sem fim, de Michael Ënde.

Claro que, quando criança, eu não pensava na representação do teorema do macaco infinito como um problema computacional… eu estava apenas intrigado pelo absurdo da situação mesmo. Só anos depois vim a saber que aquela situação era uma representação na literatura do problema filosófico / matemático do macaco infinito.

Esse artigo aqui, portanto, tem por finalidade discutir uma solução em Python para representar uma parte ínfima do teorema do macaco infinito.

Bom, depois dessa enorme introdução, você talvez esteja curioso: afinal do que se trata o teorema do macaco infinito? Vamos a ele, então!

Basicamente, o que o teorema postula é que um número infinito de macacos, digitando aleatoriamente em um número infinito de máquinas de escrever (o problema é antigo!) eventualmente virá a escrever um determinado texto qualquer ordenado, como, por exemplo, a obra completa de Shakespeare.

A questão, portanto, se enquadra bem à representação computacional. A ideia é gerar caracteres aleatórios e compará-los com uma entrada previamente determinada. A cada vez que se encontrasse algum texto, digitado pelo macaco abstrato, que fosse semelhante a algum trecho da entrada determinada, esse texto seria armazenado. Até que, eventualmente, teríamos o texto completo.

É claro que, para a obtenção dessa entrada completa, seria necessário também um tempo infinito…


Cadê o código afinal?

É! Onde está o código?!? A promessa era uma representação em Python para resolver o problema do macaco infinito. Muito bem, aqui está uma representação do macaco digitando na máquina de escrever. É bastante simples, com o uso de randrange:

import random

class MacacoInfinito:

	char_a = 97
	char_z = 123	# o randrange não inclui o último char...
			# o char de z é 122... logo, aumentei para 123

	# gerar_macaco gera uma palavra de tamanho aleatório
	def gerar_macaco(self, *args):
		# vamos gerar palavras de tamanho n até m
		if len(args) == 2:
			tamanho = 
                         'a' * random.randrange(args[0], args[1])
		else:
			''' 
              se não forem passados argumentos
              há uma opção default (de 2 até 10)
            '''
			tamanho = 'a' * random.randrange(2, 10)
		
		palavra = ''

		# o macaco escreve aqui
		for letra in tamanho:
			proxima = chr(random.randrange(self.char_a, 
                                      self.char_z))
			palavra += proxima

		return palavra



# main
if __name__ == '__main__':
	macaco = MacacoInfinito()
	contador = 0

	# 50 iterações do macacoInfinito
	while True:
		x = macaco.gerar_macaco(3,12)
		contador += 1
		print(x)

		if contador==50:
		    break

Como podemos ver no código, nossos macacos infinitos escrevem apenas com letras minúsculas… Utilizamos ali os códigos ASC II para ir de “a” (ASC II é 97) até “z” (ASC II é 122). O randrange não inclui o parâmetro de stop — a função gera um número pseudoaleatório entre x (inclusive) e y (sem incluir y) — ; sendo assim, em “z” indicamos o ASC II “errado” (123, que não é incluído).

A mágica toda do algoritmo acontece na linha

proxima = chr(random.randrange(self.char_a, self.char_z))

na qual obtemos um char aleatório, que é retornado pelo nossa função randrange. Na linha seguinte, acrescentamos a letra à palavra que estamos escrevendo (até o limite determinado pela variável tamanho). Depois, retornamos a palavra assim formada.

Como um efeito divertido, acrescentamos *args (para definir o tamanho mínimo e máximo das palavras que serão geradas). Se não forem passados argumentos, o método gera palavras de 2 a 10 letras aleatoriamente.

Enfim, o algoritmo é bastante simples… mas é divertido. É curioso que, ao testar o macaco infinito aqui, enquanto eu escrevia esse artigo, tive uma surpresa, ao constatar que o algoritmo retornou duas palavras (as duas estrangeiras): “say” e “hijab“. As obras completas de Shakespeare estão perto! SQN! :)

Apesar deste ser um exercício bastante simples, espero que ele sirva ao menos como fonte de alguma diversão. É claro que há várias melhorias a se fazer aí. E podemos viajar bastante também! Que tal um algoritmo que inclua inteligência artificial e que aprimore a escrita dos nossos macacos infinitos, de forma que eles passem a escrever palavras com sentido ao invés de “brkjhgghumphhh” como normalmente acontece?

Eventualmente voltaremos com outros playgrounds do Python! Uma versão mais completa desse artigo pode ser vista no meu blog, o Gatzfolio, no qual falo sobre tecnologia, quadrinhos, bicicleta e qualquer outro assunto que pareça interessante.

0
0

Comentários (2)

0
Luciano Borges

Luciano Borges

05/10/2021 05:02

Opa! Valeu, Marjone! Qualquer dúvida com o código, estou por aqui!

1
Marjone Junior

Marjone Junior

04/10/2021 16:28

Muito Bom vou copiar téu código, pra estudar, muito bom!

Desenvolvedor Java e Python que migrou de outra área completamente diferente (anteriormente fui profissional de Editoração, da indústria do livro)

Brasil