Número aleatório não significa algo diferente a cada vez, mas algo que não pode ser previsto logicamente.
Computadores trabalham em programas, e programas são um conjunto definitivo de instruções.
Então significa que deve haver algum algoritmo para gerar um número aleatório também.
Se houver um programa para gerar um número aleatório, ele pode ser previsto, portanto, não é verdadeiramente aleatório.
Números aleatórios gerados através de um algoritmo de geração são chamados de pseudo-aleatórios.
Não precisamos de números verdadeiramente aleatórios, a menos que esteja relacionado à segurança (por exemplo, chaves de criptografia) ou a base de aplicação seja a aleatoriedade (por exemplo, roletas digitais).
Podemos fazer números verdadeiramente aleatórios? Sim.
Para gerar um número verdadeiramente aleatório em nossos computadores, precisamos obter os dados aleatórios de alguma fonte externa. Essa fonte externa geralmente são nossas teclas, movimentos do mouse, dados na rede etc.
Neste tutorial, usaremos números pseudo-aleatórios, geralmente obtidos do computador utilizando o relógio do sistema.
O módulo random trabalha com números aleatórios.
Os números aleatórios podem ser de valores de diferentes tipos.
A função randint retorna um número inteiro aleatório entre um ou dois parâmetros.
Abaixo um número inteiro aleatório entre 0 a 100 (ambos inclusive, usando apenas um parâmetro).
from numpy import random
inteiro_aleatorio = random.randint(100)
print(f"Valor e tipo: {inteiro_aleatorio}: {type(inteiro_aleatorio)}")
Abaixo um número inteiro aleatório entre 10 a 20 (ambos inclusive, usando dois parâmetros).
from numpy import random
inteiro_aleatorio = random.randint(10,20)
print(f"Valor e tipo: {inteiro_aleatorio}: {type(inteiro_aleatorio)}")
O método rand() do módulo random retorna um real aleatório entre 0 e 1.
from numpy import random
x = random.rand()
print(x)
No Numpy trabalhamos com matrizes, e você pode usar os dois métodos dos exemplos acima para fazer matrizes aleatórias.
O método randint() recebe um argumento nomeado size para especificando ao número de valores aleatórios no vetor (matriz unidimensional) ou matriz (matriz multidimensional).
Matriz 1-D (vetor) contendo 5 inteiros aleatórios entre 0 e 100, com ambos incluídos.
from numpy import random
x = random.randint(100, size=(5))
print(x)
Matriz 2-D com 3 linhas, cada linha contendo 5 inteiros aleatórios de 0 a 100.
from numpy import random
x = random.randint(100, size=(3, 5))
print(x)
O método rand() também permite especificar a forma da matriz.
Exemplo: gere uma matriz 1-D contendo 5 reais aleatórios.
from numpy import random
x = random.rand(5)
print(x)
Exemplo: gere uma matriz 2-D com 3 linhas, cada linha contendo 5 números aleatórios.
from numpy import random
x = random.rand(3, 5)
print(x)
O método choice() permite gerar um valor aleatório com base em uma matriz de valores, com a função recebendo essa matriz como argumento e retornando aleatoriamente um dos valores.
Exemplo: retorna um dos valores em uma matriz.
from numpy import random
x = random.choice([3, 5, 7, 9])
print(x)
O método choice() também permite retornar uma matriz de valores.
Adicione um sizeparâmetro para especificar a forma da matriz.
Exemplo: gere uma matriz 2-D que consiste nos valores no parâmetro de matriz (3, 5, 7 e 9).
from numpy import random
x = random.choice([3, 5, 7, 9], size=(3, 5))
print(x)
Distribuição de dados é uma lista de todos os valores possíveis e com que frequência cada valor ocorre.
Essas listas são importantes ao trabalhar com estatística e ciência de dados.
O módulo random oferece métodos que retornam distribuições de dados geradas aleatoriamente.
Uma distribuição aleatória é um conjunto de números aleatórios que seguem uma certa função de densidade de probabilidade.
Função Densidade de Probabilidade: Uma função que descreve uma probabilidade contínua. ou seja, probabilidade de todos os valores em uma matriz.
Podemos gerar números aleatórios com base em probabilidades definidas usando o método choice() do módulo random.
O método choice() permite especificar a probabilidade para cada valor.
A probabilidade é definida por um número entre 0 e 1, onde 0 significa que o valor nunca ocorrerá e 1 significa que o valor sempre ocorrerá.
Exemplo: gere uma matriz 1-D contendo 100 valores, onde cada valor deve ser 3, 5, 7 ou 9.
A probabilidade de o valor ser 3 é definida como 0,1
A probabilidade de o valor ser 5 é definida como 0,3
A probabilidade de o valor ser 7 é definida como 0,6
A probabilidade de o valor ser 9 é definida como 0
from numpy import random
x = random.choice([3, 5, 7, 9], p=[0.1, 0.3, 0.6, 0.0], size=(100))
print(x)
A soma de todos os números de probabilidade deve ser 1.
Mesmo se você executar o exemplo acima de 100 vezes, o valor 9 nunca ocorrerá.
Você pode retornar matrizes de qualquer forma e tamanho especificando a forma no parâmetro size.
Exemplo: mesmo exemplo acima, mas retorna uma matriz 2-D com 3 linhas, cada uma contendo 5 valores.
from numpy import random
x = random.choice([3, 5, 7, 9], p=[0.1, 0.3, 0.6, 0.0], size=(3, 5))
print(x)
Uma permutação refere-se a um arranjo de elementos. Por exemplo, [3, 2, 1] é uma permutação de [1, 2, 3] e vice-versa.
O módulo Numpy Random fornece dois métodos para isso: shuffle() e permutation().
Shuffle significa mudar a disposição dos elementos no local. ou seja, na própria matriz.
Exemplo: embaralhe aleatoriamente os elementos da seguinte matriz:
from numpy import random
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
random.shuffle(arr)
print(arr)
O método shuffle() faz alterações na matriz original.
Exemplo:
Gere uma permutação aleatória de elementos da seguinte matriz:
from numpy import random
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
print(random.permutation(arr))