Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Algoritmos random

Minha dúvida é: se a função random é "pseudo", ou seja, previsível, teria alguma outra função ou outra biblioteca que seja mais "aleatória"? ou algum algoritmo para se implementar?

1 resposta

Um processo pseudoaleatório é um processo que parece ser aleatório mas não é. Sequências pseudoaleatórias tipicamente exibem aleatoriedade estatística enquanto estão sendo geradas por um processo inteiramente determinístico. Tal processo é mais fácil de se produzir do que um genuinamente aleatório, e tem o benefício de poder ser utilizado vezes seguidas para produzir exatamente os mesmos números, o que é útil para teste e correção de software.

Para gerar números verdadeiramente aleatórios é necessário o uso de sistemas medições de processos absolutamente não-determinísticos, e estas medições precisam ser precisas e possíveis de serem repetidas. Linux utiliza, por exemplo, vários medidores conhecidos como system timings (como entradas do teclado, E/S, ou o dígito menos significativo de medições de tensão) para produzir uma pool de números aleatórios. Ele tenta constantemente reabastecer este pool, dependendo do seu nível de importância, e, então emitirá um número aleatório. Este sistema é um exemplo, e funciona de maneira similar àqueles que utilizam um hardware gerador de número pseudoaleatório. No contexto da Ciência da computação, uma distribuição de probabilidade é dita pseudoaleatória contra uma classe de adversários se não existe adversário desta classe que possa distinguir esta distribuição de uma distribuição uniforme com uma vantagem significante.[6] Esta noção de pseudo-aleatoriedade é estudada pela Teoria da Complexidade Computacional e tem aplicações na Criptografia.

Um Método de Monte Carlo é definido como qualquer método que utiliza sequências de números aleatórios para executar uma simulação. Simulações Monte Carlo são aplicadas em muitos tópicos, incluindo cromodinâmica quântica, terapia de câncer com radiação, fluxo de tráfego, evolução estelar e design VLSI. Todas estas simulações exigem o uso de números aleatórios e portanto geradores pseudoaleatório, o que torna a criação de números quase-aleatórios muito importante.[7]

Um exemplo fácil de como um computador faria um método de simulação Monte Carlo é o cálculo de π. Seja um quadrado e um circulo circunscrito a ele, e um ponto aleatoriamente escolhido dentro do quadrado, o ponto estará dentro ou fora do círculo. Se o processo fosse repetido muitas vezes, seria possível ver que a razão entre os pontos aleatórios que caem dentro do círculo e dos que caem fora é proporcional à razão entre a área do círculo e a área do quadrado. A partir dai podemos estimar pi, como mostrado no código em Python abaixo utilizando o pacote SciPy para gerar números pseudoaleatórios com o algoritmo de Mersenne twister (MT19937). Note que este método é uma maneira ineficiente de numericamente aproximar π.

import scipy
N=100000
x_array = scipy.random.rand(N)
y_array = scipy.random.rand(N)
# generate N pseudo-random independent x and y-values on interval [0,1)
N_qtr_circle = sum(x_array**2+y_array**2 < 1)
# Number of pts within the quarter circle x^2 + y^2 < 1 centered at the origin with radius r=1.
# True area of quarter circle is pi/4 and has N_qtr_circle points within it.
# True area of the square is 1 and has N points with in it, hence we approximate pi with
pi_approx = 4*float(N_qtr_circle)/N # Typical values: 3.13756, 3.15156

O script acima foi feito Python usando o modulo scipy, alguns site que podem te ajudar:

https://www.vivaolinux.com.br/artigo/Aleatoriedade-em-C/

https://medium.com/siac/conhecendo-as-bibliotecas-padr%C3%B5es-random-f5a5e4e909cc

https://programacaocompython.blogspot.com/2013/11/aleatoriedades-i.html