Q:

Como é gerada a randomização pelo computador? 

Dúvidas

Como é feita a randomização pelo computador? 
Qual algorítimo ou qual base matemática o computador usa para gerar
esses números? 

Por exemplo:
No JavaScript utilizo o Math.random() ele me retorna diferentes números todas as vezes como por exemplo: 
0.8908976025413722, 0.7090631313621998 e etc. 

A:

A única coisa realmente randômica são efeitos quânticos, como o decaimento radioativo (qual dos núcleos vai se partir agora?).  E isso é meio complicado de se obter em computadores domésticos. 
Vários desses algoritmos (em particular o rand() do C, que muitas linguagens usam) se baseiam em geradores pseudo-randômicos.  Eles geram uma sequencia de números que parece aleatória para uma pessoa, mas que são totalmente previsíveis se partirem de uma seed conhecida.  São, portanto, péssimos para segurança ou criptografia.  Eles pegam uma seed (valor inicial dado, geralmente partindo de uma fonte externa, como a data/hora de início do processo) e aplicam transformações para gerar o próximo valor.  A vantagem é que são rápidas.  E o fato de serem previsíveis permite que você guarde a seed de um puzzle gerado como seu id, por exemplo, e não tenha que gastar espaço algum com o puzzle em si, basta gerar novamente pela mesma seed. 
Por exemplo: (acabo de inventar esse algoritmo, não é bom)
static double seed; // uma seed entre 0 e 1
double random() {
   seed /= 1125899839733759;  // um número primo
   seed *= 18014398241046527; // outro
   seed -= (int)seed;         // normalizar
   return seed;
}

int main() {
    seed = 0.753;
    printf("%f\n", random()); // 0.048001
    printf("%f\n", random()); // 0.768009
    printf("%f\n", random()); // 0.288139
    printf("%f\n", random()); // 0.610224
    printf("%f\n", random()); // 0.763582
}

(coliru)
Um dos algoritmos mais usados para isso é o Mersenne Twister, que é capaz de gerar 219937-1 números antes de repetir a sequencia. 
Para qualquer caso desses, é importante que se tome cuidado na escolha da seed.  Se um atacante ganha conhecimento da seed usada por você, ele pode prever todos os movimentos do programa.  Um exemplo desse tipo de ataque contra um site de poker online pode ser encontrado nesse artigo: How We Learned to Cheat at Online Poker: A Study in Software Security.  O ataque se inicia com o conhecimento de que a função Randomize() do Pascal é utilizada e de que ela usa como seed o número de milissegundos desde a meia noite.  O problema é que posso chutar o tempo exato em que aconteceu a randomização no servidor (ou seja, a hora que o poker foi iniciado).  Considerando que erre 1 minuto para mais ou para menos, são apenas 180.000 possíveis sequencias.  Um número extremamente pequeno para um computador, basta testar todas as sequencias possíveis e comparar qual gera as cartas que tenho em mãos.  No momento que descobrir qual é a sequencia, é possível extrapolar e conhecer as cartas na mão de todos os jogadores.  Conhecimento aprendido: Usar apenas o relógio como fonte de uma seed que deveria ser aleatória e oculta é uma péssima ideia. 
Outros métodos se baseiam em fontes de entropia que possa ser obtida do hardware, como por exemplo análises de uso do teclado, movimentação do mouse, tráfego de pacotes na rede, etc.  Tendo dados suficientes isso será tão próximo do aleatório quanto possível.  No Linux você pode ler dessa fonte através dos pseudo-arquivos /dev/random ou /dev/urandom.  Eles são uma boa fonte se você precisa de número randômicos reais e podem ser utilizados para inicializar a seed de um gerador pseudo-randômicos, se conveniente. 

A:

A maioria dos geradores de números pseudo aleatórios (PRNG) funciona da seguinte forma (algoritmo LC):
 x1 = (a .  x0 + b) mod n

onde x0 é a "semente", ou número aleatório anterior, a e b são constantes escolhidas, e n é o maior número aleatório desejado.  Lembrando que mod é a operação de resto da divisão. 
Isto é utilizado com números inteiros, provavelmente o Javascript gera um número inteiro de 64 bits ou maior e divide por uma constante antes de retornar via Math.random(), já que nesta função o número vem entre 0 e 1. 
A qualidade deste PRNG depende da boa escolha de a e b. Para ver quais as constantes e/ou a implementação exata o jeito é consultar o fonte da implementação Javascript em que você está interessado, se ela for de código-fonte aberto (V8/Node é, Mozilla é, outras não). 
Há PRNGs mais modernos que o LC.  Mersenne Twister é muito utilizado e recomendado.  Como o Math.random() do Javascript não pode ser "semeado",  ele pode fazer uso de qualquer PRNG, então só mesmo consultando o fonte para ver qual é. 

A:

A aleatoriedade está relacionada ao conceito de imprevisibilidade: dado um número (ou sequência de números) você ser incapaz de prever qual será o próximo número.  Além disso, outros requisitos podem estar presentes, como a probabilidade de cada número dentro do domínio ser sorteado (que, em geral, deve ser a mesma). 
Os computadores em geral são determinísticos, ou seja: o mesmo programa executado duas vezes com todas as entradas idênticas irão produzir duas saídas idênticas.  Por essa razão, uma fonte externa é necessária para se produzir resultados realmente aleatórios.  Isso não é algo que o computador consiga produzir por si só. 
Como uma fonte dessas raramente está presente, diversos algoritmos foram concebidos para produzir sequências de números que são - até certo grau - indistinguíveis de uma sequência aleatória, a partir de um único valor de partida (semente, ou seed).  Esse valor de partida tem de ser diferente a cada invocação do programa, mas não precisa necessariamente ser aleatório, por isso uma fonte muito utilizada é o relógio do sistema.  Algoritmos desse tipo são chamados de Geradores de Números Pseudo-Aleatórios (PRNG). 
Algumas aplicações, como criptografia, exigem que as sequências geradas sejam realmente imprevisíveis sem o conhecimento da(s) fonte(s) externa(s).  Um PRNG comum pode ter sua semente "adivinhada" após a observação de um número finito (e computacionalmente falando, não muito grande) de números gerados anteriormente.  Isso não é um problema em domínios como simulações (pois basta que a sequência pareça aleatória), mas quando a segurança de um sistema e/ou a confidencialidade de uma comunicação depende dessa aleatoriedade, um algoritmo mais sofisticado se faz necessário (um CSPRNG - PRNG Criptogtraficamente Seguro). 
Uma forma de se fazer isso é gerar uma sequência de números pseudo-aleatórios usando como semente uma chave secreta.  Isso é feito através de um simples contador (zero, um, dois...) onde cada elemento é criptografado ou hasheado com o auxílio dessa chave.  Essa é, inclusive, a maneira como a maioria das cifras de fluxo (stream cipher) funcionam: gere uma sequência aleatória de bytes, e combine essa sequência com os dados usando XOR. 
Quando uma semente secreta não está disponível, então só resta recorrer a outras fontes externas, como mencionado anteriormente.  Vários eventos do próprio computador podem ser considerados "imprevisíveis", como: a) as teclas digitadas pelo usuário ou o movimento do mouse; b) a data de criação dos diversos arquivos (ou mesmo seu conteúdo); c) os dados históricos de utilização da CPU; etc.  Nem sempre a entropia (desordem, imprevisibilidade) desses eventos é suficiente, mas sua combinação com um PRNG pode aumentar amplamente a qualidade do mesmo.  Como mencionado em outra resposta, os números gerador por um PRNG comum começam a repetir após um determinado período.  Se o mesmo for combinado com dados de fontes externas (mistura, ou mixing) esse período pode ser bastante alongado - o que é suficiente para muitas aplicações práticas. 
Por fim, se nada disso for suficiente, só resta o uso de módulos de hardware (provavelmente envolvendo mecânica quântica) ou dados de sistemas externos.  O site random.org, por exemplo, gera uma sequência de números aleatórios baseado em informações atmosféricas (atmospheric noise) - que são tão imprevisíveis com a tecnologia atual que podem ser considerados "realmente aleatórios".  Naturalmente, não se deve usá-los para operações confidenciais (como a geração de senhas e chaves) pois eles provém de terceiros, mas para aplicações científicas ou talvez sorteios em jogos de azar, eles podem ser uma boa alternativa.