Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Python

Módulos Matemáticos em Python: Random

by
Difficulty:IntermediateLength:ShortLanguages:
This post is part of a series called Mathematical Modules in Python.
Mathematical Modules in Python: Math and Cmath
Mathematical Modules in Python: Decimal and Fractions

Portuguese (Português) translation by Erick Patrick (you can also view the original English article)

Aleatoriedade está ao nosso redor. Ao lançarmos uma moeda ou um dado, nunca temos certeza do resultado final. Essa imprevisibilidade tem muitas aplicações como na escolha dos vencedores em sorteios ou geração de casos de teste para experimentos com valores aleatórios com base em algoritmos.

Tendo essa utilidade em mente, Python provê-nos o módulo random. Podemos usá-lo em jogos para criar inimigos aleatoriamente ou misturar elementos numa lista.

Como Random Funciona?

Quase todas as funções desse módulo dependem da função random() básica, que gera um número de ponto flutuante maior ou igual a zero e menor que um. Python usa o gerador de números flutuantes Mersenne Twister. Ele produz números com 53-bit de precisão, com um período de 2**19937-1. É o gerador de número pseudo-aleatório de propósito geral mais usado.

Algumas vezes, queremos que o gerador de número reproduza a sequência de números criada uma vez. Isso é obtido ao prover a mesma semente ambas as vezes ao gerador, usando a função seed(s, version). Se o parâmetro s é omitido, o gerador usará o tempo atual do sistema para gerar os números. Eis um exemplo:

Tenhamos em mente que, diferente de jogar moedas, o módulo gerar números pseudo-aleatórios que são completamente determinísticos, assim, não servem para criptografia.

Gerando Inteiros Aleatórios

O módulo tem duas funções diferentes para gerar inteiros aleatórios. Podemos usando randrange(a) para gerar números inteiros menores que a.

Igualmente, podemos usar randrange(a, b[,step~) para gerar um número aleatório dentre range(a, b, step). Por exemplo, random.randrange(0, 100, 3) só retornará números entre 0 e 100 e que são divisíveis por 3.

Se sabemos tanto os limites inferiores e superiores de números que queremos gerar, podemos usar uma função mais simples e intuitiva, randint(a, b). É um simples atalho para randrange(a, b+1).

Funções para Sequências

Para selecionar um elemento aleatório de uma sequência não vazia, podemos usar choice(seq). Com randint(), somos limitados a selecionar números de uma série. choice(seq) nos permite escolher um número de qualquer sequência quisermos.

Outra coisa boa dessa função é que não é limitada a números. Pode selecionar qualquer elemento aleatoriamente de uma sequência. Por exemplo, o nome do vecendor de um sorteio entre cinco pessoas diferentes, providos como cadeias de caracteres, pode ser determinado facilmente usando essa função.

Se misturarmos a sequência ao invés de selecionar um elemento aleatório, podemos usar a função shuffle(seq). Isso resultará em uma mistura da sequência. Para uma sequência de apenas 10(n) elementos, há um total de 362880(n!) arranjos diferentes. Com uma sequência maior, o número de permutações possíveis será maior—implicando que a função nunca poderá gerar todas as permutações de uma sequência grande.

Digamos que temos de escolher 50 estudantes de um grupo de 100 para uma viagem.

Aqui, talvez estejamos tentados a usar choice(seq). O problema é que devemos chamá-la cinquenta vezes no melhor dos cenários, onde não escolhemos o mesmo estudantes de antes.

Uma solução melhor é usar sample(seq, k). Ela retornará uma lista de k elementos únicos da sequência em questão. A original será mantida intacta. Os elementos da lista resultante estarão na ordem selecionada. Se k é maior que o número de elemento da sequência, um ValueError será lançado.

Como vemos, shuffle(seq) modifica a lista original, mas sample(seq, k) a mantem intacta.

Gerando Pontos Flutuantes Aleatórios

Nessa seçã, aprenderemos sobre funções que podem ser usadas para gerar números a partir de distribuições específicas. Os parâmetros da maioria dessa funções são nomeados em relação à variável correspondente na equação real da distribuição.

Quando queremos um número entre 0 e 1, podemos usar random(). Se quisermo um número em uma série específica, usando uniform(a, b), onde a e b são os limites inferiores e superiores, respectivamente.

Digamos que precisamos gerar um número aleatório entre inferior e superior, de modo que tenha uma maior probabilidade de cair na vizinhança de outro número, moda. Podemos fazê-lo com triangular(inferior, superio, moda). Os valores inferiores e superiores serão 0 e 1 por padrão. De forma similar, o valor padrão da moda será o ponto central entre inferior e superior, resultando numa distribuição simétrica.

Há muitas outras funções para gerar números aleatórios om base em distribuições diferentes. Como exemplo, podemos usar normalvariate(mu, sigma) para gerar uma número aleatório com base numa distribuição normal, sendo mu a média e sigma o desvio padrão.

Probabilidade Ponderada

Como vimos, é possível gerar números aleatórios com distribuições uniforme, triangular ou normal. Mesmo em uma série finita como de 0 a 100, há infinitos números de pontos flutuantes que podemos ser gerados. E se há um número finito de elementos e quremos adicionar mais pesos a alguns valores especificar ao selecionar um número aleatório? Essa situação é comum em sistema de loteria onde números com pouca recompensa são dados maiores pesos.

Se é aceitável na aplicação ter pesoas na forma de inteiros, podemos criar uma lista de elementos cujas frequências dependem de seus pesos. Podemos então usar choice(sea) para selecionar um elemento aleatoriamente dessa lista ponderada. Eis um exemplo mostrando uma seleção do tamanho de prêmio, aleatoriamente.

No nosso caso, levou 10 tentativas para obter uma prêmio de US$2 da lista. As chances de obter o prêmio de US$100 são bem menores. Assim, podemos influenciar outros programas.

Ideias Finais

Esse módulo pode ser bem útil em várias situações, como misturndo questões em um teste ou gerando nomes de usuários ou senhas aleatórias usando shuffle(). Também podemos gerar números aleatórios uniformemente ou dar pesos a números em uma série específica. No próximo tutorial, usaremos as funções desse módulo para gerar dados aleatórios para análises estatísticas.

Há alguma aplicação interessante para geradores de números aleatórios que podem ser úteis para outros leitores? Diga-nos nos comentários.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.