Módulo Random

Teoria Completa

Aleatoriedade em Python

Fala aí! Todos os nossos programas são executados de forma linear, seguindo as lógicas que a gente escreveu. Mas as vezes é útil a gente usar alguns dados aleatórios pra que nosso programa não tenha sempre o mesmo comportamento. Por isso eu vou te mostrar o módulo de funções aleatórias, chamado random.

Mas antes, eu queria te falar que a aleatoriedade na computação não é 100% real. Lembra que os computadores são só calculadoras?! É impossível chegar em um valor 100% aleatório com uma calculadora. É por isso que, por baixo dos panos, rola uma malandragem do Python pra criar números “quase” aleatórios (cálculos doidos que a gente não precisa saber ainda). É por isso que são chamados de pseudo-aleatórios (pseudo = falso). Resumindo, se tiver escrito “pseudo-aleatórios” na sua prova, estão falando disso aqui mesmo, ok?!

Usando aleatoriedade em Python

A primeira coisa que a gente tem que fazer pra ter acesso às funções aleatórias é importar o módulo random. Pra isso, digite, na primeira linha do seu programa, o seguinte código:

Agora, a gente já tem acesso às funções. Vou te apresentar todas elas.

Funções aleatórias

Pra gente usar funções que estão dentro do módulo random, precisamos usar “random.” antes do nome das funções. Vamo descobrir quais são elas!

Vamos falar sobre cada uma das funções, mas vou deixar a random.seed() por último, ok?!

Função random.random()

A função random.random() retorna um número real (float) entre 0 e 1, mas sem contar com o 1. Isso quer dizer que pode retornar qualquer número entre 0 e 1, pode retornar 0 também, mas nunca vai retornar 1. Pros fãs de cálculo, o intervalo da função é [0,1). Olha um exemplo:

Função random.randint()

A função random.randint() retorna um número inteiro (int) no intervalo que a gente passar como parâmetro. Mas tu também precisa se ligar que o 50 não tá incluído, igual na função random.random(). O resultado pode ser qualquer número entre 2 e 50, pode ser 2 também, mas nunca vai ser 50.

Nesse caso, o intervalo da função foi [2,50).

Função random.choice()

Essa função, random.choice(), recebe como parâmetro (entre parênteses) uma lista ou string. O resultado é um dos itens da lista ou um dos caracteres da string.

Olha, na variável item r3 foi um dos itens da lista uma_lista, escolhido aleatoriamente. Os itens podem ser de qualquer tipo, ok?!

Mas na variável r4 tem um dos caracteres da string uma_string.

Agora bora olhar a função random.seed().

Função random.seed()

Cara, tu lembra que lá no início desse tópico eu disse que os números aleatórios não são realmente aleatórios?! Então… Basicamente, todas as funções do módulo random fazem contas doidas com o valor que você passar na função random.seed(). O importante que você precisa entender é que, se você usar o mesmo seed, o resultado dos números aleatórios vão ser iguais.

Olha, eu coloquei um seed 123 que eu escolhi, mas é um número qualquer. Pode ser qualquer número real. Depois eu pedi um número aleatório entre 2 e 50, e o retorno foi 5. Depois eu troquei o seed e o resultado foi diferente. Mas saca que quando eu volto o seed pra 123 e faço a mesma operação, o resultado foi 5 de novo!

Se você não quiser que os números aleatórios se repitam, é só você não colocar nenhum seed. Vou te dar exemplos, calma.

Se você escrever esse código no seu editor de texto e executar duas vezes (ou mais), você vai ver que resultado vai ser sempre igual.

Mas se você tirar o seed, vai ser sempre diferente.

Resumidamente, você só precisa usar o random.seed() se você quiser que os números aleatórios sejam pré definidos, ok?! Se a questão não falar nada sobre seed, não precisa usar.

Com essas funções vai conseguir mandar bem na sua prova! Mas não pode esquecer de praticar nos exercícios de fixação, jae?!

Valeu, manooo!

Expandir

Exercício Resolvido #1

INF1031, Lista - Adaptado

Escreva um programa que implemente o jogo conhecido como pedra, papel, tesoura. Neste jogo, o usuário e o computador escolhem entre pedra, papel ou tesoura. Sabendo que pedra ganha de tesoura, papel ganha de pedra e tesoura ganha de papel, exiba na tela o ganhador: usuário ou computador. Para esta implementação, assuma que o número 0 representa pedra, 1 representa papel e 2 representa tesoura. O programa deve pedir para o usuário entrar com sua escolha, gerar aleatoriamente a escolha do computador, exibir a escolha e indicar o vencedor

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Fala comigo, varão de guerra! Aqui a gente tem que simular um jogo de pedra, papel, tesoura. Por algum motivo a gente vai ter que usar números em vez de strings pra checar qual a jogada do usuário. Por que o professor fez isso?! Não sei.

Mas enfim… Apesar de não estar escrito no enunciado, eu gostaria de começar escrevendo pro usuário as instruções do jogo.

Pronto! Antes mesmo de o jogo começar, vai ser exibido na tela essa instrução. Aí, a gente pode perguntar qual a jogada do usuário! Pra isso, vamos usar a função input() e converter a entrada pra inteiro, assim:

E pronto! Agora a gente tem, na variável “usuario”, a jogada do cara. Precisamos criar uma jogada aleatória pra máquina, e é isso que vamos fazer agora.

Passo 2

Olha, a jogada da máquina precisa ser aleatória. Mas, pra gente acessar as funções aleatórias, precisamos antes importar esse módulo lá no início do programa, lembra?

E agora a gente pode usar a função randint pra definir a jogada da máquina de forma aleatória.

Show! Já temos a jogada da máquina. Seria justo exibir pro usuário qual foi a jogada da máquina, então vamos usar um print() pra isso.

E pronto! Só falta a gente descobrir quem venceu, né?!

Passo 3

Olha, pra gente descobrir quem venceu, a gente vai precisar usar alguns if. Primeiro, vamos checar o empate, que é o caso mais fácil de identificar.

E agora a gente precisaria pensar nas combinações necessárias pra vencer o jogo, mas a gente não vai. Porque, se não empatou, a gente só tem duas opções: ou perder ou vencer. Então, a gente pode fazer uma lista mapeando qual jogada vence de qual. Pra isso, vou criar uma lista chamada jogo:

Repara que eu criei uma lista com os valores 2,0,1, nessa ordem. Cara, deixa eu te mostrar como tá a relação entre os índices da lista e os valores que a gente colocou ali.

Reparou que, dessa forma, o número que tá no índice é justamente a jogada que vence o valor? 0 (pedra) vence 2 (tesoura), 1 (papel) vence 0 (pedra) e 2 (tesoura) vence 1 (papel). Assim, a gente consegue com vem mais facilidade verificar quem venceu o jogo.

A lista jogo retorna quem perde pra aquela jogada. Então, jogo[usuario] retorna quem perde pro usuário. Se jogo[usuario] for igual a “maquina”, então a máquina perdeu. Se não, a máquina venceu, sacou?! Malandramente, evitamos várias linhas de código!

E por enquanto é isso, maninho! Te vejo no próximo (NÃO PULA O PRÓXIMO EXERCÍCIO). Valeuuu!

Resposta

Exercício Resolvido #2

INF1031 - PUC-Rio, Lista - Adaptado

O computador “escolhe” (gera aleatoriamente) um número entre 1 e 1024, e o usuário tenta adivinhar o número escolhido. Para cada tentativa do usuário, o programa deve exibir na tela:

  • o número -1, se o número gerado for menor do que o número fornecido pelo usuário;
  • o número 1, se o número gerado for maior do que o número fornecido pelo usuário;
  • o número 0, se o número gerado for igual ao fornecido pelo usuário. Neste caso, o programa deve exibir o número de tentativas usadas pelo usuário para acertar a escolha do computador e finalizar a execução.

O usuário tem direito a um máximo de 20 tentativas. Quando se esgotarem, o programa deve imprimir “acabaram suas tentativas” e terminar.

Implemente e teste este jogo. Para implementar as repetidas tentativas, use recursão.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Coe, shinobi! Bora fazer um joguinho onde é o usuário que precisa acertar o número gerado aleatoriamente pelo programa. E o enunciado exige que as repetições sejam feitas usando recursão, o que nos obriga a programar o jogo dentro de uma função.

Então vamos começar definindo a função do nosso jogo que eu, criativamente, vou chamar de “jogo”.

Nossa função recebe quantas tentativas o usuário ainda tem e, se for maior do que 0, precisamos perguntar um número!

E, com o número em mãos, precisamos exibir 1, -1 ou 0, dependendo das condições impostas no enunciado.

Passo 2

Cara, o enunciado tá falando pra, em caso de acerto, exibir 0. Caso o chute seja menor, 1 e -1 caso o chute seja maior. Pra implementar essa lógica, vamos usar algumas estruturas condicionais.

E pronto! O programa já vai dar a resposta da primeira jogada. Mas esse jogo tem que se repetir 20 vezes, e com recursão. Por isso, depois do else a gente pode adicionar uma chamada recursiva, descontando uma tentativa...

Repara que a resposta continua sendo a mesma do início do jogo, ok?! Por isso passamos ela adiante sem alterações. Mas o enunciado também diz que, quando acerta, precisamos exibir o número de tentativas usadas. A gente pode fazer isso subtraindo o número total de tentativas pelo número que ainda restam. Tipo assim:

E pronto! Só falta a gente chamar essa função no nosso programa, né?!

Passo 3

Olha, pra gente começar o jogo que tá dentro da função, precisamos chamar a função no nosso programa. Porém, a resposta da partida tem que ser gerada de forma aleatória entre 0 e 1024, assim como dito no enunciado. Pra trabalhar com funções aleatórias, a gente tem que importar o módulo random no início do nosso arquivo, tá?