Módulo 5 - Módulos e a biblioteca padrão

Matemática e sorte: math e random

11 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

O que você vai aprender

  • Usar o módulo math: sqrt, pi, ceil e floor.
  • Gerar números aleatórios com randint e random.
  • Escolher e embaralhar itens com choice e shuffle.
  • Saber quando cada função de aleatoriedade é a certa.

O módulo math: contas prontas

O módulo math reúne as operações matemáticas que não vêm nos operadores básicos. Você já tem soma, subtração e potência com o próprio Python, mas raiz quadrada, o valor de pi, logaritmos e arredondamentos específicos moram no math. As quatro funções mais usadas no dia a dia são sqrt, para raiz quadrada, a constante pi, e o par ceil e floor, que arredondam sempre para cima e sempre para baixo, respectivamente. Diferente do round, que arredonda para o mais próximo, esses dois têm direção fixa.

import math

print(math.sqrt(144))    # 12.0
print(math.pi)           # 3.141592653589793

# ceil sempre para cima, floor sempre para baixo
print(math.ceil(4.1))    # 5
print(math.floor(4.9))   # 4

# util de verdade: quantas caixas de 12 para 100 itens?
itens = 100
por_caixa = 12
caixas = math.ceil(itens / por_caixa)
print(f"Precisa de {caixas} caixas")  # Precisa de 9 caixas

math.ceil é perfeito para arredondar quantidades para cima, como caixas ou páginas.

O exemplo das caixas mostra por que ceil aparece tanto em código real. Cem itens em caixas de doze dão oito caixas cheias e sobra, então você precisa de nove. Um round arredondaria para oito e deixaria itens de fora; o floor faria o mesmo. Sempre que a resposta precisa comportar tudo, o arredondamento é para cima, e ceil resolve. Guarde a dupla: ceil para cima, floor para baixo, sem depender do valor das casas decimais.

O módulo random: sorteio e embaralhamento

O módulo random traz o acaso controlado para os seus programas: sortear um número, escolher um item de uma lista, embaralhar uma sequência. As quatro funções que resolvem quase tudo são randint, choice, shuffle e random. A randint sorteia um inteiro dentro de um intervalo, incluindo as duas pontas, ótima para simular um dado. A choice pega um item aleatório de uma lista. A shuffle embaralha a lista no próprio lugar. E a random, sem argumentos, devolve um decimal entre zero e um.

import random

# um dado de 6 lados: inclui 1 e 6
print(random.randint(1, 6))     # ex.: 4

# escolher um item de uma lista
frutas = ["maca", "uva", "pera", "manga"]
print(random.choice(frutas))    # ex.: pera

# embaralhar no proprio lugar (nao devolve nada)
baralho = [1, 2, 3, 4, 5]
random.shuffle(baralho)
print(baralho)                  # ex.: [3, 1, 5, 2, 4]

# um decimal entre 0.0 e 1.0
print(random.random())          # ex.: 0.732...

As quatro funções mais úteis do random, cada uma com um exemplo de saída.

Um detalhe importante de honestidade técnica: os números do random são pseudoaleatórios. Eles vêm de uma fórmula que imita o acaso muito bem para jogos, sorteios e simulações, mas são previsíveis para quem conhece a semente. Por isso, nunca use random para gerar senhas, tokens ou qualquer coisa de segurança. Para esses casos, o Python tem o módulo secrets, feito sob medida. Para o resto, um dado, um sorteio de brinde, embaralhar cartas, o random é exatamente a ferramenta certa.

Juntando math e random

Na prática, esses dois módulos costumam trabalhar juntos. Imagine simular vários lançamentos de dois dados e ver a média dos resultados. O random gera cada lançamento; um pouco de matemática resume tudo no final. O trecho abaixo lança dois dados mil vezes, soma cada par e calcula a média das somas. É uma simulação simples que já mostra como aleatoriedade e conta andam de mãos dadas.

import random

lancamentos = 1000
soma_total = 0
for _ in range(lancamentos):
    dado1 = random.randint(1, 6)
    dado2 = random.randint(1, 6)
    soma_total += dado1 + dado2

media = soma_total / lancamentos
print(f"Media da soma de 2 dados: {media:.2f}")
# Media da soma de 2 dados: ~7.00 (o valor teorico e 7)

Simular mil lançamentos de dois dados: a média da soma se aproxima de 7, o valor teórico.

Rode algumas vezes e repare que a média fica sempre pertinho de sete, o valor que a estatística prevê para a soma de dois dados. Aumente para dez mil lançamentos e ela chega ainda mais perto. Isso é uma simulação: em vez de calcular a probabilidade na teoria, você deixa o computador experimentar muitas vezes e observa o padrão emergir. É um dos usos mais divertidos do random, e você vai fazer algo parecido na prática do fim deste módulo.

Teste rápido

Qual função escolhe um item aleatório de uma lista já existente?

Perguntas frequentes

Por que math.sqrt(9) devolve 3.0 e não 3?
Porque as funções do math trabalham com ponto flutuante e devolvem um float, o tipo de número com casas decimais. Por isso o resultado sai como 3.0. Se você precisar de um inteiro, pode converter com int(math.sqrt(9)), lembrando que isso corta a parte decimal.
Qual a diferença entre ceil, floor e round?
O math.ceil sempre arredonda para cima e o math.floor sempre para baixo, não importa a casa decimal. Já o round arredonda para o inteiro mais próximo, então round(4.9) dá 5 e round(4.1) dá 4. Use ceil quando a resposta precisa comportar tudo, como número de caixas.
O random.randint(1, 6) pode devolver 6?
Pode. A randint inclui as duas pontas do intervalo, então randint(1, 6) sorteia qualquer inteiro de 1 a 6, os dois inclusive. Isso a torna perfeita para simular um dado. É diferente do range, que não inclui o número final.
Por que meu shuffle guardou None em vez da lista?
Porque random.shuffle embaralha a lista no próprio lugar e devolve None, não uma lista nova. Não escreva nova = random.shuffle(lista). Chame random.shuffle(lista) sozinho e depois use a própria lista, que já ficou embaralhada.
Posso usar random para gerar senhas?
Não é recomendado. Os números do random são pseudoaleatórios e previsíveis para quem conhece a semente, o que é inseguro. Para senhas, tokens e qualquer coisa de segurança, use o módulo secrets, feito para gerar valores imprevisíveis. Para jogos e sorteios comuns, o random serve bem.
O que é uma semente (seed) do random?
É um número inicial que determina a sequência de valores pseudoaleatórios. Com random.seed(42), por exemplo, você fixa a semente e obtém sempre a mesma sequência, útil para testes reproduzíveis. Sem definir a semente, o Python usa uma baseada no horário, e cada execução varia.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.