Como gerar números aleatórios com NumPy em Python

Como gerar números aleatórios com NumPy

Gerar números aleatórios é uma tarefa comum em muitas áreas da ciência de dados e a biblioteca NumPy oferece uma variedade de funções para criar números aleatórios de diferentes distribuições. Neste tutorial, vamos explorar como gerar números aleatórios usando NumPy.

Antes disso, faço uma introdução básica aos números aleatórios.

O que é um número aleatório?

Um número aleatório (random number) é um valor que é selecionado de forma imprevisível e sem padrão aparente. Esses números são usados em muitos campos, como em jogos de azar, modelagem de sistemas complexos, simulações, criptografia e outras aplicações em ciência de dados e engenharia.

Em computação, é possível gerar números aleatórios usando algoritmos que simulam o comportamento de um processo natural aleatório, como a movimentação de partículas em um gás ou o decaimento radioativo de um átomo.

Esses números gerados computacionalmente são conhecidos como números pseudoaleatórios, pois são determinísticos e repetíveis, mas parecem ser aleatórios o suficiente para muitas aplicações.

Os números aleatórios são importantes para muitas áreas da ciência e da tecnologia e podem ser usados para modelar o comportamento de sistemas complexos ou simular o resultado de eventos incertos.

Números aleatórios encontram muitas aplicações em programação, como na construção de jogos.

Números aleatórios encontram muitas aplicações em programação, como no desenvolvimento de jogos.

O que é um número pseudoaleatório?

Um número pseudoaleatório é um valor gerado por um algoritmo determinístico que parece ser aleatório. Diferentemente dos números verdadeiramente aleatórios, que são produzidos por processos físicos imprevisíveis, os números pseudoaleatórios são gerados por computadores usando um algoritmo matemático.

Embora os números pseudoaleatórios sejam gerados por um processo determinístico, eles são projetados para ter propriedades estatísticas semelhantes às dos números verdadeiramente aleatórios, como uniformidade e independência.

Além disso, os algoritmos de geração de números pseudoaleatórios geralmente usam uma semente inicial como entrada, que pode ser usada para reproduzir a mesma sequência de números aleatórios em diferentes momentos.

Os números pseudoaleatórios são amplamente utilizados em aplicações de simulação, jogos, criptografia e outras áreas em que a aleatoriedade é necessária, mas a geração de números verdadeiramente aleatórios é difícil ou impraticável.

No entanto, é importante lembrar que os números pseudoaleatórios não são verdadeiramente aleatórios e podem ser previsíveis em certas circunstâncias.

O que é uma semente?

Semente é um valor inicial que é usado como entrada para um algoritmo de geração de números aleatórios, seja ele pseudoaleatório ou verdadeiramente aleatório. A semente é usada para inicializar o gerador de números aleatórios, determinando a sequência de números aleatórios que será gerada.

Quando uma semente é fornecida para um gerador de números aleatórios, a mesma sequência de números aleatórios será gerada toda vez que o algoritmo for executado com a mesma semente. Isso é útil em muitos casos em que a repetibilidade é desejada, como em testes de software, simulações e experimentos científicos.

A escolha da semente pode afetar a qualidade dos números aleatórios gerados, especialmente no caso de algoritmos pseudoaleatórios, que são determinísticos e produzem sequências que podem ser previsíveis.

Para evitar previsibilidade, é recomendável escolher sementes que sejam difíceis de adivinhar ou baseá-las em eventos aleatórios, como a hora atual do relógio do sistema ou a posição do cursor do mouse.

Em resumo, uma semente é um valor inicial que é usado para determinar a sequência de números aleatórios gerados por um algoritmo de geração de números aleatórios. A escolha da semente é importante para garantir a qualidade e a aleatoriedade dos números gerados.

Vejamos agora como gerar números aleatórios em Python, neste tutorial usando a biblioteca NumPy.

Números aleatórios em Python com NumPy

Antes de começar, é importante notar que a biblioteca NumPy usa um gerador de números pseudoaleatórios, que gera números aparentemente aleatórios, mas que são determinísticos e podem ser reproduzidos se o estado do gerador for conhecido. Para controlar o estado do gerador, você pode usar a função numpy.random.seed() para definir uma semente aleatória.

Vamos aos passos para gerar números aleatórios com NumPy:

Passo 1: Importar o módulo NumPy

Para começar, precisamos importar o módulo NumPy usando o comando import numpy. É uma boa prática usar um alias para o módulo, como import numpy as np, para tornar o código mais legível.

import numpy as np

Passo 2: Definir uma semente aleatória (opcional)

Se quisermos gerar números aleatórios determinísticos, podemos definir uma semente aleatória usando a função numpy.random.seed(). Lembre-se que a semente é um número inteiro que define o estado inicial do gerador de números pseudoaleatórios.

np.random.seed(42) # Define a semente aleatória como o valor 42

Passo 3: Gerar números aleatórios de uma distribuição

Agora podemos gerar números aleatórios usando uma das funções de distribuição de NumPy. Algumas delas incluem:

  • numpy.random.rand() – gera uma matriz de números aleatórios uniformemente distribuídos no intervalo [0, 1).
  • numpy.random.randn() – gera uma matriz de números aleatórios normalmente distribuídos com média 0 e desvio padrão 1.
  • numpy.random.randint(low, high=None, size=None, dtype=’l’) – gera uma matriz de inteiros aleatórios entre low e high, excluindo high.
  • numpy.random.random_sample(size=None) – gera uma matriz de números aleatórios uniformemente distribuídos no intervalo [0, 1).
  • numpy.random.choice(a, size=None, replace=True, p=None) – gera uma matriz de amostras aleatórias a partir de uma matriz a com ou sem substituição.

Exemplos:

# Gera uma matriz de 3 números aleatórios uniformemente distribuídos no intervalo [0, 1).
np.random.rand(3)

# Gera uma matriz de 3 números aleatórios normalmente distribuídos com média 0 e desvio padrão 1.
np.random.randn(3)

# Gera uma matriz de 3 inteiros aleatórios entre 0 e 9.
np.random.randint(0, 10, 3)

# Gera uma matriz de 3 números aleatórios uniformemente distribuídos no intervalo [0, 1).
np.random.random_sample(3)

# Gera uma matriz de 3 amostras aleatórias com substituição a partir de uma matriz de números [0, 1, 2, 3, 4, 5].
np.random.choice([0, 1, 2, 3, 4, 5], 3, replace=True)

Passo 4: Salvar ou imprimir os números aleatórios

Aqui, podemos mostrar na saída os números gerados com a função print(), armazená-los em uma estrutura de dados, como uma lista, em um arquivo, ou alimentar outros processos dentro do programa com os valores gerados.

Passo 5: Gerenciar o formato e o tipo de dados dos números aleatórios

As funções de distribuição de NumPy geralmente retornam matrizes de números aleatórios com um formato e tipo de dados padrão, que podem ser diferentes do que precisamos em nosso projeto. Porém, podemos usar as funções NumPy para gerenciar o formato e o tipo de dados dos números aleatórios gerados.

# Gera uma matriz de 3 números aleatórios uniformemente distribuídos no intervalo [0, 10).
# Retorna um array de float64 por padrão.
random_array = np.random.rand(3) * 10

# Converte o array para o tipo de dados int32.
int_array = random_array.astype(np.int32)

# Imprime as matrizes geradas
print(random_array)
print(int_array)

Passo 6: Usar uma semente aleatória para reproduzir resultados

Como mencionado anteriormente, é possível definir uma semente aleatória para gerar números pseudoaleatórios determinísticos. Isso é útil em muitas situações, como testes de unidade ou experimentos científicos que precisam ser reproduzíveis.

# Define a semente aleatória como 42
np.random.seed(42)

# Gera uma matriz de 3 números aleatórios uniformemente distribuídos no intervalo [0, 1).
random_array = np.random.rand(3)
print(random_array)

# Define a semente aleatória como 42 novamente
np.random.seed(42)

# Gera a mesma matriz de 3 números aleatórios uniformemente distribuídos no intervalo [0, 1).
random_array_reproduzido = np.random.rand(3)
print(random_array_reproduzido)

Saída:

Números aleatórios com numpy em python - usando semente 42

 

Agora que sabemos como gerar números aleatórios usando NumPy, podemos usá-los em nossos projetos de ciência de dados ou experimentos científicos. Devemos nos lembrar de que a escolha da distribuição de probabilidade e dos parâmetros da função de distribuição depende do problema em questão.

Extra: Algoritmos empregados para criar números aleatórios ou pseudoaleatórios

Existem diversos algoritmos utilizados para gerar números aleatórios ou pseudoaleatórios. Alguns exemplos incluem:

  • Algoritmos Congruenciais Lineares (LCGs): são algoritmos simples que geram números pseudoaleatórios através de uma função matemática linear que utiliza o valor anterior gerado como entrada. A fórmula básica é Xn+1 = (aXn + c) mod m, onde a, c e m são constantes e Xn é o número gerado na n-ésima iteração.
  • Algoritmos Mersenne Twister: são algoritmos mais avançados que geram números pseudoaleatórios com melhor qualidade estatística e período mais longo do que os LCGs. Eles usam um registro interno grande para armazenar o estado atual do gerador e aplicam uma série de operações matemáticas para produzir os números.
  • Algoritmos criptográficos: são algoritmos projetados para garantir a segurança e a aleatoriedade dos números gerados, sendo frequentemente utilizados em aplicações como a geração de chaves criptográficas e a autenticação de dados. Alguns exemplos incluem o algoritmo Fortuna e o algoritmo de gerador de números aleatórios (RNG) baseado em hardware.
  • Algoritmos baseados em física: são algoritmos que geram números aleatórios com base em processos físicos aleatórios, como a decaimento radioativo de um átomo ou o ruído térmico em um circuito eletrônico. Esses algoritmos podem produzir números verdadeiramente aleatórios, mas geralmente são mais lentos e difíceis de implementar do que os algoritmos pseudoaleatórios.

Esses são alguns exemplos de algoritmos usados para gerar números aleatórios ou pseudoaleatórios, e cada um tem suas vantagens e desvantagens dependendo do contexto de uso.

 

Sobre Fábio dos Reis (1195 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 30 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Ciência e Tecnologia em geral, adora Viagens e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.

Escreva um comentário

Seu e-mail não será divulgado


*