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á?

E aí, com o módulo random importado e a função do jogo devidamente declarada, a gente pode chamar com a resposta aleatória e com o número máximo de tentativas, que é 20:

E pronto, agora falta só mais um detalhe… Quando o usuário acerta, a gente não precisa mais continuar o jogo, temos que parar o loop. Mas acontece que não tem um “break” em repetições com recursão.

Mas dá uma segurada, porque a recursão tem o caso base, e ela só continua a repetição enquanto o caso base não é atingido. Pra gente parar imediatamente uma recursão, a gente só precisa forçar um caso base! Se liga na treta:

Olha! Depois de acertar, definimos “tentativa” pra 1. Aí, na chamada recursiva vai ser passada tentativa-1=0. Com isso, o loop vai terminar, porque na próxima repetição a tentativa não vai ser maior que 0.

E assim a gente finalizou a questão! Valeuuu!

Resposta

Exercício Resolvido #3

Elaboração Própria

Escreva um programa que receba o nome de uma sequência de times de futebol e exiba uma as partidas de um torneio com os times, de forma que:

  • As partidas devem ser geradas de forma aleatória.
  • O número de times digitados deve ser par.
  • O programa deve pedir nomes até que seja digitado “fim”

Exemplo:

Entrada:

Digite um time: Flamengo

Digite um time: Vasco

Digite um time: Fluminense

Digite um time: Botafogo

Digite um time: Bangu 2

Digite um time: Barcelona

Digite um time: fim

Barcelona x Botafogo

Saída:

Fluminense x Vasco

Bangu 2 x Flamengo

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

E aí, vingador!!! Bora resolver esse exercício na força do ódio?!

A ideia é perguntar pro usuário nomes de times pro campeonato até que seja dita a palavra “fim”. Então a gente não sabe quantos times vão ser… Nessa situação, é uma boa ideia a gente usar uma lista pra armazenar o nomes dos times e uma estrutura de repetição while. Tipo assim:

E pronto! Assim, o programa vai perguntar e adicionar na lista os nomes dos times… Agora, fora do laço de repetição, precisamos checar se um número par de times foi adicionado. E pra isso a gente pode verificar se o resto da divisão por dois da quantidade de times na lista é igual a zero. Se liga:

E já vamos preencher com uma mensagem caso seja ímpar…

E pronto! Só falta a gente ordenar o campeonato agora...

Passo 2

Mas como a gente poderia fazer pra ordenar aleatoriamente o campeonato?!

Primeiramente, vamos precisar importar o módulo random pra ter acesso a algumas funções de aleatoriedade. Segundamente, a gente até poderia ir pegando itens aleatórios da lista,m as tem uma forma mais fácil! Vamos usar o random.shuffle().

Essa função recebe e EDITA uma lista, ordenando-a de forma aleatória. Aí, a gente pode dizer que os times jogaram com o time do lado, já que estão embaralhados… hahaha saca só

Enquanto tiver times na lista, a gente exibe uma partida entre os dois primeiros, afinal, eles foram escolhidos aleatoriamente pra ser os primeiros… E depois, a gente atualiza a lista pra deletar esses dois primeiros que usamos, sacou?!

E pronto! Finalizamos o exercício. Te espero no próximo, tá? Valeuuu

Resposta

Exercício Resolvido #4

CEFET-Itaguaí, P5 (19.2)

Implemente o jogo "A Máquina Adivinha". Neste jogo, o usuário entra com uma palavra e a máquina tenta descobrir a palavra escolhendo letra por letra. A quantidade máxima de letras que a máquina pode escolher pra tentar formar a palavra é o dobro do tamanho da palavra. O programa não memoriza as jogadas anteriores. Caso a máquina forme a palavra, ela ganha o jogo, caso contrário, o usuário é o vencedor!

Exemplo 1:

Entrada: dez

Saída:

Letra a? ["_","_","_"]

Letra d? ["d","_","_"]

Letra b? ["d","_","_"]

Letra a? ["d","_","_"]

Letra e? ["d","e","_"]

Letra z? ["d","e","z"]

Eu ganhei!

Exemplo 2:

Entrada: flu

Saída:

Letra x? ["_","_","_"]

Letra y? ["_","_","_"]

Letra b? ["_","_","_"]

Letra u? ["_","_","u"]

Letra q? ["_","_","u"]

Letra z? ["_","_","u"]

Você ganhou!

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Fala comigo, meu compatriota! Nessa aqui a gente junta uns conhecimentos de laços de repetição com o módulo random e tira de letra! Vem comigo que te mostro como resolver essa parada!

A gente precisa perguntar pro usuário uma palavra e tentar fazer nosso programa adivinhar ela. Então bora perguntar com a função input().

Começamos bem! hehehe mas como a gente sabe que vai precisar usar o módulo random em algum lugar, bora adiantando as coisas já importando o módulo no início do código.

Show! E, pra armazenar os acertos da máquina, bora fazer uma lista com “_” do mesmo tamanho da palavra:

Pronto! Agora que já temos tudo certo, bora começar os trabalhos de adivinhação.

Passo 2

Primeiramente, o enunciado diz que o computador pode tentar até o dobro de letras do tamanho da palavra. Então, vamos fazer um laço de repetição que se repita 2 * len(palavra) vezes! Se liga nesse for:

Irado! Agora a gente quer chutar uma letra do alfabeto… Vou usar a função choice(), mas também poderia ter escolhido usar qualquer outra que tenha o mesmo resultado, ok?!

Criei uma variável pra armazenar todo o alfabeto e depois, dentro do loop, disse que o chute da máquina tem que ser um dos itens do alfabeto (ou seja, alguma letra). Agora, a gente tem que verificar se essa letra existe na palavra e, se existir, a gente substitui na lista “tentativa”.

Viu? Se a letra existir, a gente substitui na lista na mesma posição que a letra se encontra na string “palavra”, e depois tira essa letra da string. A gente repete isso até não ter mais aquela letra na string! Assim, o programa consegue abranger todas as letras repetidas, sacou? Agora, a gente pode exibir a tentativa no formato que foi especificado no enunciado.

Pronto! Com o print dessa forma, vai ser exibida a tentativa exatamente como no exemplo do professor… Só falta a gente dizer, no fim, se a máquina venceu ou não.

Passo 3

Pra verificar se a máquina acertou tudo, a gente só precisa verificar, depois do loop, se sobrou algum “_” sem ser preenchido na lista “tentantiva”. Se sobrou, então a máquina perdeu, caso contrário, venceu!

E assim, a gente finaliza o exercício! hehehe até o próximo, doido! Nós se vê por aí!

Resposta

Exercício Resolvido #5

Elaboração própria

Escreva um programa que pergunte nomes de alunos de uma sala de aula. O número de alunos é desconhecido, por isso o programa deve perguntar até que seja digitada a palavra “fim”. Depois, o programa deve sortear um aluno para apresentar o trabalho primeiro.

Exemplo:

Digite um nome: Yann

Digite um nome: Camilinha

Digite um nome: Richardneydson

Digite um nome: Claudiane

Digite um nome: fim

O primeiro aluno a apresentar será: Claudiane.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

E ai, meu padrin! Bora resolver essa questão doida.

E pra começar, a gente pode perguntar o nome do aluno. Mas a gente não sabe quantos nomes serão digitados e, por isso, é uma boa ideia colocar os nomes numa lista! Assim, podemos perguntar indefinidamente… Então vamos criar uma lista e um laço de repetição indefinido, que é feito com o while.

Pronto! Com essa estrutura, o programa já pergunta os nomes até a gente digitar “fim”...

Passo 2

Agora, a gente precisa escolher um dos nomes aleatoriamente. Bom, a primeira coisa que precisamos fazer pra ter acesso às funções aleatórias é importar o módulo random, certo?

E agora, depois do while, a gente precisa escolher um aluno aleatoriamente. Existe uma função do módulo random que faz exatamente o processo de selecionar um item numa lista. Você lembra qual é?! É a choice(), pô! Vem comigo:

Depois dessa linha, a variável “selecionado” vai armazenar os nome de um aluno escolhido aleatoriamente. Agora, a gente só precisa exibir.

Passo 3

Pô, pra exibir o nome do azarado selecionado, a gente vai usar a função mais famosa de todas: print(). E também vamos usar formatação de string pra ficar mais bonitinho, ok?! Se liga em como a gente pode fazer: