Conhecendo as bibliotecas padrões: random — parte 2

Conheça as funções mais utilizadas da biblioteca random

Felipe Pontes
Mar 13, 2017 · 4 min read

Na primeira parte, falei sobre os métodos para obtenção de números inteiros aleatórios.

Agora irei abordar embaralhamento de listas e como recuperar elementos aleatórios de sequências.

Para referência, consulte a documentação oficial.


Embaralhando listas

Digamos que você esteja desenvolvendo um jogo de cartas, naturalmente você precisará garantir que o baralho não será sempre ordenando da mesma maneira.

Neste cenário, a biblioteca random oferece dois métodos:

shuffle(x)

Embaralhe esta lista

Aplicando o cenário apresentado:

Embaralhando cartas

sample(seq, k)

Retorne uma lista ordenada aleatoriamente de tamanho k dessa sequência

No método anterior, você deve ter notado que a função modifica a própria sequência passada como parâmetro. Caso não queira modificar sua lista inicial, você pode chamar: random.sample(cards, len(cards))

O sample pode ser utilizado ainda para retornar sequências menores através do parâmetro k.

Obtendo uma mão de 5 cartas aleatórias

Outro recurso deste método é a sua utilização com tuplas, sets e frozensets, já que o método shuffle lançaria as respectivas exceções:

Embaralhando tuplas, sets e frozensets

Note que o sample sempre retorna uma nova lista, não importando se a sequência inicial era uma tuple, set ou frozenset.

Sorteando elementos

choice(seq)

Retorne uma escolha aleatória dessa sequência

Vamos imaginar o seguinte cenário:

O protótipo de um sistema de etiquetamento de livros foi desenvolvido com uma interface incrível, mas o cliente precisa aprovar e no seu banco de dados só tem os livros e as possíveis etiquetas como “Lido”, “Abandonado”, “Lendo” entre outras.

Você tem, então, a tarefa que criar um script para etiquetar os livros cadastrados de maneira aleatória apenas para apresentação do protótipo. Utilizando o método choice, chegamos ao seguinte algoritmo:

Sorteando etiquetas para livros

O método choice é muito útil certamente, porém há casos que ele pode dá um pouco mais de trabalho em alguns casos. Vamos pegar uma loteria, por exemplo: sabemos que os números são num intervalo de 1 a 60 e precisamos escolher seis números aleatórios.

Realizando uma loteria

Note que para cada chamada do choice, precisamos explicitamente remover o elemento sorteado da nossa lista antes de sortear novamente para garantir que nossa loteria não terá números repetidos.

Para resolver o problema da loteria, devemos utilizar o método sample, o qual garante que os elementos não sairão repetidos.

choices(seq, weights, cum_weights, k)

Sorteie e retorne uma lista de k elementos dessa sequência

No Python 3.6, foi implementado o método choices (no plural), que é similar ao supracitado sample, porém a lista sorteada não é necessariamente composta de elementos únicos.

Sorteando o lanche

Atenção nos argumentos weights e cum_weights. Em bom português, ambos definem o “peso” para escolha dos elementos, ou seja, quanto maior o peso, maior a probabilidade deste elemento ser sorteado.

A diferença entre os dois está (acredite ou não) no cum, prefixo para cumulative (cumulativo). Para entender melhor, vamos ver o próprio exemplo da documentação:

Os pesos relativos (weights) [10, 5, 30, 5] são equivalentes aos pesos cumulativos (cum_weights) [10, 15, 45, 50].

Internamente, o método converterá os pesos relativos para cumulativos, então fornecer os pesos já na forma cumulativa, poderá trazer resultados mais performáticos em grande escala.

Para exemplificar o uso de pesos, vamos solucionar o seguinte problema:

A escola do seu bairro sorteará 2 novos notebooks entre cinco estudantes, os quais foram selecionados de acordo com o comportamento deles. Entretanto, a direção deixou claro que as notas finais serão poderão ser decisivas no sorteio, ou seja, o aluno com melhor desempenho tem mais chances de ganhar.

Fazendo uso da nova função choices, chegamos ao seguinte script:

Sorteando alunos com pesos

Note que o aluno #2 tem uma média de 90, porém não ganhou o sorteio, mesmo tendo o maior peso, o que significa maior probabilidade de ser sorteado.

Outra observação importante sobre o choices: diferente do sample, o argumento k pode ser maior que o tamanho da sequência, ou seja:

Um último exemplo do uso do choices:

Criando melodias

Bônus: embaralhando palavras

Como sabemos, em Python, as strings são sequências de caracteres imutáveis. Isso significa que eu não posso alterar nenhum caractere dentro da string, ao contrário de como funciona as listas, que são mutáveis.

Alterando elementos de sequências

Como vimos anteriormente, podemos utilizar o método sample para embaralhar sequências imutáveis. Porém essa função retornará uma lista, independente do tipo da sequência passada.

Para contornar isso, podemos utilizar o método builtin join.

Então chegamos a seguinte solução:

Embaralhando meu nome

Note que chamamos o método sample passando a nossa string como sequência e a quantidade k é o comprimento da nossa string.


Queria agradecer ao Francisco Bento pela revisão do conteúdo e a ajuda nos exemplos.

Se surgiu alguma dúvida, não deixe de comentar.

Encontrou algum erro? Por favor, comente… corrigirei e citarei você 😉

SIAC

Sistema Interativo de Avaliação de Conhecimento

Felipe Pontes

Written by

Estudando para alcançar algo…

SIAC

SIAC

Sistema Interativo de Avaliação de Conhecimento

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade