# Integrando o Mersenne Twister com o NS2/Procedimentos
## Introdução

A disponibilidade de números aleatórios é extremamente útil em uma variedade de situações, como nas simulações de fenômenos físicos (indo desde a física nuclear até engenharia de sistemas), em amostragem de uma população, na programação de computadores, na tomada de decisões ou até mesmo em entretenimento (bingos, loterias ou jogos). Na área de simulação, consideremos, por exemplo, a modelagem do tempo de acesso de um disco rígido, num computador pessoal. Podemos determinar que a duração desse evento irá ficar numa faixa conhecida, digamos de 0 a 200ms, de acordo com características físicas inerentes ao próprio disco rígido. Entretanto, o valor real desse evento vai depender de vários fatores, como a posição da cabeça de leitura quando a requisição é feita pelo sistema operacional, detalhes espúrios da implementação do suporte à controladora no sistema e até mesmo da temperatura e outras condições ambientais. Podemos considerar então que esse tempo de acesso é uma variável aleatória seguindo uma distribuição conveniente, e simulamos com o objetivo de ver se nosso modelo adere a realidade. Para fazermos essa simulação precisamos de números aleatórios que sigam essa dada distribuição, e para isso precisamos saber primeiro como gerar esses números aleatórios.

## Objetivo

Integrar o gerador de pseudo números aleatórios Mersenne Twister com o NS2
No desenvolvimento do trabalho vamos estudar o algoritmo para geração de números aleatórios do Mersenne Twister e, em seguida, vamos estudar também alguns testes de aleatoriedade, que nos fornecem um meio objetivo de verificar a aleatoriedade de uma seqüência. Vamos também implementar alguns desses métodos e fazer testes para verificar como eles se comportam.

## Metodologia

Para tal experimento, utilizaremos um computador dual core.
Usando o NS2.29 com o Akaroa, rodaremos algoritmos que comprovadamente necessitam de números pseudo-aleatórios de qualidade para gerarem resultados satisfatórios. O experimento vai se basear em testar a qualidade dos números aleatórios gerados pelo Mersenne Twister.

## Justificativa

Para um simulador gerar resultados próximos da realidade, seu gerador de número aleatório deve ser o mais confiável possível. Este projeto visa integrar ao simulador um gerador de números aleatório com resultados mais confiáveis (Mersenne Twister) para que a simulação seja o mais próximo do valor teórico possível.

## Nível do curso

Superior. Simulação de Sistemas.

## Pré-Requisito

Ter instalado o NS 2.29.3 com o akaroa 2.7.6 ewrwer wer we rw er wer we r wer we r we rw r

## Procedimentos de integração

Faça o download Mersenne Twister no website: http://wwwpersonal.umich.edu/~wagnerr/MersenneTwister.html
Após desconpactar, na pasta do Mersenne, será necessário alterar o Makefile.in do NS2. Faça o seguinte:
Dentro da pasta do NS2, no caso o nsallinone2.29/ns2.29/ se encontra o Makefile.in
Edite o Makefile.in e adicione nos INCLUDES a linha: -I/caminho da pasta do Mersenne. No meu caso, como o Mersenne estava no meu /home, a linha adicionada foi: -I/home/caloa/Mersenne
obs.: Não esqueça de colocar a “ \ “ na linha anterior à nova linha.
Incluido o Mersenne no Makefile.in, podemos agora modificar o código do akaroa para usar o Mersenne Twister em vez do gerador de código padrão.
Edite o arquivo akaroa.cc, que se encontra dentro da pasta /nsallinone2.29/ns2.29/tools.
Inclua a seguinte linha após o último “#include”:
#include "MersenneTwister.h";
Agora procure o método:
long next
Logo acima dele, inclua o código:
MTRand mtrand1;
Agora, dentro do método long next existirá a linha:
seed_ = ((long) ((unsigned long) ( ((unsigned long)(MAXINT+1)) * AkRandomReal)));
Substitua o AkRandomReal por mtrand1. A linha deve ficar assim:
seed_ = ((long) ((unsigned long) ( ((unsigned long)(MAXINT+1)) * mtrand1)));
Agora, dentro do método double next_double, faça a mesma substituição.
return AkRandomReal;
Deve ficar:
return mtrand1;
Após estas alterações, faça dentro da pasta do /nsallinone2.29/ns2.29 os seguintes comandos: ./configure e espere terminar. ./make clean e espere terminar. ./make e espere terminar. ./install e espere terminar.
Caso as instruções tenham sido seguidas corretamente, o ns2 estará funcionando com seu novo gerador de número aleatório.
Para fazer um teste, faça o download do arquivo de teste: http://www.tkn.tuberlin.de/research/ns2_akaroa2/mm1.tcl
Para executar, o comando é:
ns mm1.tcl

## Conclusões

Usamos para o experimento, vários tipo de filas. Foram eles: MEK1, MHK1 e MMMKM.
Executamos todas as filas, tanto com o gerador padrão do NS2 quanto com o NS2 já modificado com o gerador de números pseudo-aleatórios Mersenne Twister.
Os resultados utilizando o Mersenne foram um pouco melhores que utilizando o gerador nativo do NS2 com todas as filas experimentadas. Porém, conhecendo a possibilidade de usar vários geradores de números em conjunto com o NS2, nos dá uma grande abertura para experimentar outros geradores e buscar cada vez mais, melhores e mais eficientes resultados.