# Python random: Funções para gerar números aleatórios

O módulo Python random dispõe de uma série de recursos para a **geração de números aleatórios** em diferentes formatos (como de inteiros e de vírgula flutuante), para controlar a aleatoriedade das sequências geradas, para realizar distribuições aleatórias, para embaralhar sequências e também para fins criptográficos. Nosso artigo introdutório sobre Python random apresenta suas principais características, apresenta as funções mais usadas e lhe ensina a aplicá-las em códigos.

## O que é o módulo Python random?

O módulo Python random é uma biblioteca integrada que fornece funcionalidades para a geração de números aleatórios e a execução de operações randômicas por aplicações. Ele também dispõe de funções capazes de **criar números pseudoaleatórios** de alta qualidade que podem ser utilizados nas mais diversas situações, como em simulações e testes, no desenvolvimento de jogos e na segurança criptográfica.

Uma das características mais importantes do módulo random de Python é capacidade que ele tem de se repetir de forma determinística e previsível. Desde que seja definido um valor inicial (valor semente ou *seed*), a geração randômica do módulo random pode ser reproduzida, o que é especialmente útil em testes, experimentos e simulações que exigem a geração repetida de dados aleatórios consistentes.

## Lista de funções do módulo Python random

O módulo Python random oferece suporte a diferentes funções capazes de **gerar e processar números aleatórios**. Ainda, você também pode definir funções personalizadas para controlar ou modificar o comportamento da geração de números aleatórios. Compilamos, abaixo, uma tabela com as principais funções já estabelecidas de Random, assim como a utilidade de cada uma delas:

<table>
  <thead>
    <tr>
      <th>F unção</th>
      <th>Explicação</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`seed(a=None, version=2)`</td>
      <td>Define o valor inicial (*seed*) para a geração de números aleatórios.</td>
    </tr>
    <tr>
      <td>`getstate()`</td>
      <td>Retorna o estado atual da geração de números aleatórios como objeto.</td>
    </tr>
    <tr>
      <td>`setstate(state)`</td>
      <td>Redefine o estado da geração de números aleatórios com base em um objeto de estado.</td>
    </tr>
    <tr>
      <td>`getrandbits(k)`</td>
      <td>Retorna um número inteiro com *k* bits.</td>
    </tr>
    <tr>
      <td>`randrange(start, stop, step)`</td>
      <td>Gera um número inteiro aleatório a partir de um intervalo especificado.</td>
    </tr>
    <tr>
      <td>`randint(a, b)`</td>
      <td>Retorna um número inteiro aleatório dentro de um intervalo especificado.</td>
    </tr>
    <tr>
      <td>`choice(seq)`</td>
      <td>Retorna um elemento aleatório de uma sequência especificada.</td>
    </tr>
    <tr>
      <td>`choices(population, weights=None, *, cum_weights=None, k=1)`</td>
      <td>Gera uma lista com\* k\* elementos selecionados aleatoriamente dentre uma população; opcionalmente, é possível definir as probabilidades.</td>
    </tr>
    <tr>
      <td>`sample(k, population)`</td>
      <td>Cria uma lista com *k* elementos selecionados aleatoriamente dentre a população, sem duplicatas.</td>
    </tr>
    <tr>
      <td>`shuffle(x)`</td>
      <td>Mistura os elementos de uma lista de forma aleatória.</td>
    </tr>
    <tr>
      <td>`random()`</td>
      <td>Retorna um número de vírgula flutuante aleatório dentro do intervalo de 0 a 1.</td>
    </tr>
    <tr>
      <td>`uniform(a, b)`</td>
      <td>Retorna um número de vírgula flutuante aleatório dentro do intervalo especificado, incluindo os valores inicial e final.</td>
    </tr>
    <tr>
      <td>`triangular(low, high, mode)`</td>
      <td>Gera um número de vírgula flutuante aleatório dentro de um intervalo de distribuição triangular.</td>
    </tr>
    <tr>
      <td>`betavariate(alpha, beta)`</td>
      <td>Retorna um número de vírgula flutuante aleatório a partir de uma distribuição beta.</td>
    </tr>
    <tr>
      <td>`expovariate(lambd)`</td>
      <td>Retorna um número de vírgula flutuante aleatório a partir de uma distribuição exponencial.</td>
    </tr>
    <tr>
      <td>`gammavariate(alpha, beta)`</td>
      <td>Gera um número de vírgula flutuante aleatório a partir de uma distribuição gama.</td>
    </tr>
    <tr>
      <td>`gauss(mu, sigma)`</td>
      <td>Retorna um número de vírgula flutuante aleatório a partir de uma distribuição de Gauss.</td>
    </tr>
    <tr>
      <td>`lognormvariate(mu, sigma)`</td>
      <td>Gera um número de vírgula flutuante aleatório a partir de uma distribuição normal logarítmica.</td>
    </tr>
    <tr>
      <td>`normalvariate(mu, sigma)`</td>
      <td>Retorna um número de vírgula flutuante aleatório a partir de uma distribuição normal.</td>
    </tr>
    <tr>
      <td>`vonmisesvariate(mu, kappa)`</td>
      <td>Retorna um número de vírgula flutuante aleatório a partir de uma distribuição de von Mises.</td>
    </tr>
    <tr>
      <td>`paretovariate(alpha)`</td>
      <td>Retorna um número de vírgula flutuante aleatório a partir de uma distribuição de Pareto.</td>
    </tr>
    <tr>
      <td>`weibullvariate(alpha, beta)`</td>
      <td>Retorna um número de vírgula flutuante aleatório a partir de uma distribuição de Weibull.</td>
    </tr>
  </tbody>
</table>

## Python random para selecionar elementos aleatórios de uma lista

Se você precisa selecionar diferentes elementos de uma lista aleatoriamente, pode fazer uso da função `choices(seq, k=n)`, do módulo random de Python. Na estrutura dessa função, `n` faz menção ao número de elementos aleatórios desejados, como você pode perceber no exemplo abaixo:

```python
import random
# A list of elements
my_list = ['Apple', 'Banana', 'Orange', 'Strawberry', 'Cherry']
# Randomly selecting an element from the list
random_elements = random.choices(my_list, k=3)
print("Randomly selected elements:", random_element)
```

Nesse código, fizemos uso da função `choices()` para selecionar randomicamente três elementos da lista que chamamos de `my_list`. Assim sendo, os resultados serão retornados no formato de uma lista que conterá apenas três elementos aleatórios dos cinco previamente listados.

## Python random para embaralhar uma lista

A função `shuffle()` de random consegue reordenar elementos de [listas Python](https://www.ionos.com/digitalguide/websites/web-development/python-list/ "Lista  em Python") de forma aleatória. Observe o código abaixo para entender melhor:

```python
import random
# A list of elements
my_list = ['Apple', 'Banana', 'Orange', 'Strawberry', 'Cherry']
# Shuffle the elements in the list
random.shuffle(my_list)
print("Shuffled list:", my_list) # Example Output: Shuffled list: ['Strawberry', 'Banana', 'Apple', 'Cherry', 'Orange']
```

Perceba que, como mostra o exemplo, a função `shuffle()` não gera uma lista nova, mas sim altera a lista já existente. Ou seja, ao aplicar a função `shuffle()` do módulo random de Python, você terá sua lista original embaralhada aleatoriamente, o que significará que seus elementos mudarão de lugar.

## Python random para definir um valor inicial

Se você quer utilizar a função `random.seed()` do módulo Python random para **definir um valor inicial (*seed*) específico e garantir a reprodutibilidade dos resultados**, deve iniciar a geração de números com base em um valor semente. Dessa forma, se você definir o mesmo valor semente em outro momento, o mesmo conjunto de números aleatórios será gerado pelo seu código. O exemplo ilustra a situação:

```python
import random
# Setting the seed value to 42
random.seed(42)
# Generating random numbers
print(random.random())  # Example output: 0.6394267984578837
print(random.random())  # Example output: 0.025010755222666936
# Resetting the seed value to 42
random.seed(42)
# Generating random numbers again
print(random.random())  # Example output: 0.6394267984578837 (identical to the previous value)
print(random.random())  # Example output: 0.025010755222666936 (identical to the previous value)
```

Após a definição de um valor semente qualquer, os números aleatórios solicitados foram gerados e exibidos. Como esse **mesmo valor semente** foi novamente definido pelo módulo random somado à função seed, os mesmos números aleatórios foram igualmente gerados, uma segunda vez. No nosso exemplo, por duas vezes `random.seed` definiu o valor semente como 42. Assim sendo, os mesmos números aleatórios tiveram de ser gerados.


This is a markdown version of: [https://www.ionos.com/pt-br/digitalguide/sites-de-internet/desenvolvimento-web/python-random/](https://www.ionos.com/pt-br/digitalguide/sites-de-internet/desenvolvimento-web/python-random/) for AI/LLM consumption.