A resposta de Dave resume-a bastante bem, mas para esclarecer um pouco mais sobre a segunda opção:
um gerador de números aleatórios de hardware real usa uma fonte de entropia física. Essa fonte de entropia pode ser radiação cósmica, ruído elétrico, efeito avanlanche de um diodo com polarização reversa (ou transistor BJT), circuito chua, etc. Quanto menos determinística a fonte de entropia, melhor a qualidade da saída aleatória. Uma fonte ideal de entropia seria usar um efeito da física quântica, ou algo que não possa ser modelado com equações determinísticas.
Outro fator importante com geradores de números aleatórios é que a fonte de entropia pode gerar apenas uma quantidade limitada de entropia por unidade de tempo. Um bom exemplo é o circuito chua: embora seja bastante aleatório, possui velocidade muito baixa e não pode ser usado para aplicação na vida real.
Em muitos processadores / microcontroladores com RNGs incorporados, o relógio varia de 2 a 4 relógios que são deliberadamente incorretamente sincronizados. Em seguida, eles usam filtros analógicos e digitais para randomizar ainda mais o padrão e alterar o resultado em um registro. A realização dessa filtragem requer alguns ciclos, o que explica a quantidade mínima de ciclos necessária em um determinado relógio antes que o valor mais recente esteja disponível.
O desvio do relógio não é um efeito quântico, portanto pode ser modelado, mas é aleatório o suficiente, porque depende de muitos parâmetros, como temperatura, processo de silício, frequência de operação, ruído elétrico, radiação de fundo, etc. .
Em aplicativos em que o RNG de hardware não possui rendimento suficiente (como em aplicativos criptográficos altamente exigentes), é bastante comum usar o RNG de hardware como uma semente para um gerador de números pseudo-aleatórios, como a função rand () no sdtlib. No entanto, essa aplicação geralmente fornece uma melhor implementação do rand (), que é especificamente projetado para ser executado a partir de uma semente que pode ser descartada com frequência com valores aleatórios verdadeiros . No processador Intel mais recente, com RNGs de hardware integrados, a parte do algoritmo pseudo-aleatório é integrada diretamente no silício, sendo executada pelo hardware, produzindo uma taxa de transferência aleatória muito alta.
Se você se importa com o método rand (), é apenas uma expressão matemática que foi projetada para gerar uma quantidade suficiente de entropia. Grande o suficiente, dependendo da aplicação: para gerações de chaves criptográficas, é necessário que a aleatoriedade seja de qualidade superior à aleatoriedade necessária para uma simples reprodução aleatória no seu reprodutor de música favorito. É óbvio que quanto maior a qualidade da saída aleatória, maior o custo computacional do número aleatório.
As operações envolvidas em um número aleatório são bastante semelhantes às envolvidas na computação do hash MD5 de um arquivo: elas tentam usar um tipo de efeito de avalanche de bits para que uma única mudança de bit em um valor de semente mude todo o padrão de geração. Como uma observação lateral, NÃO recomendo usar o MD5 como um gerador de números pseudo-aleatórios; foi apenas um exemplo. Seria ineficiente e não tão aleatório, mas o ponto é o seguinte: se você alimentar o mesmo arquivo com um algoritmo MD5, sempre obterá a mesma saída determinística, da mesma maneira que sempre obteria a mesma saída. a função rand () se você inserir a mesma semente, a menos que sua implementação dependa de alguns elementos arbitrários, como a hora atual.