August 26, 2014 1 Descricao O Mersenne Twister e um gerador de n umeros pseudo aleatorios.
E de longe o gerador de n umeros pseudo aleatorios mais utilizado. Muitas linguagens de programacao o trazem implementado em seus metodos randomicos nativos. Este nome foi escolhido pelo fato do tamanho do perodo dele ser escolhido para ser um n umero primo de Mersenne. Foi desenvolvido em 1997 por Makoto Matsumoto e Takuji Nishimura, ambos da Univer- sidade de Hiroshima. Foi o primeiro gerador de n umeros pseudo aleatorios de alta qualidade. 2 Vantagens e desvantagens Vantagens: A versao que geralmente e usada do Mersenne Twister, a MT19937, que produz uma sequencia de inteiros de 32 bits possui caractersticas desejaveis como: a Possui um perodo bastante grande de 2 199371 . Um perodo enorme sozinho nao e garantia de um gerador de qualidade, mas perodos pequenos como 2 32 podem ser problematicos. b Se sai bem em varios testes estatsticos, inclundo o teste Diehard. Desvantagens: E outras indesejaveis como: a O espaco do estado e muito grande e estressa o cache da CPU (Um perodo de 2 512 e suciente para qualquer aplicacao). Os criadores propuseram uma versao mais leve com piores propriedades estatsticas, mas usando apenas 127 bits de espaco de estado. b Para os dias de hoje, ele e um pouco lento, a menos que seja usada a implemen- tacao SFMT, que e a versao mais leve. c Ele passa na maioria dos testes de esmagamento, mas nao em todos. 1 3 Detalhamento do algoritmo // Cria um array de tamanho 624 para armazenar o estado do gerador int[0..623] MT int index = 0 // Inicia o gerador com uma semente function initialize_generator(int seed) { index := 0 MT[0] := seed for i from 1 to 623 { // itera em cada elemento do array MT[i] := lowest 32 bits of(1812433253 * (MT[i-1] xor (right shift by 30 bits(MT[i-1]))) + i) // 0x6c078965 } } // Extrai um numero aleatorio "temperado" baseado no index-esimo valor, // chamando generate_numbers() a cada 624 numeros function extract_number() { if index == 0 { generate_numbers() } int y := MT[index] y := y xor (right shift by 11 bits(y)) y := y xor (left shift by 7 bits(y) and (2636928640)) // 0x9d2c5680 y := y xor (left shift by 15 bits(y) and (4022730752)) // 0xefc60000 y := y xor (right shift by 18 bits(y)) index := (index + 1) mod 624 return y } // Gera o array de 624 numeros "nao-temperados" function generate_numbers() { for i from 0 to 623 { int y := (MT[i] and 0x80000000) // bit 31 (32nd bit) de MT[i] + (MT[(i+1) mod 624] and 0x7fffffff) // bits 0-30 (primeiros 31 bits) de MT[...] MT[i] := MT[(i + 397) mod 624] xor (right shift by 1 bit(y)) if (y mod 2) != 0 { // y impar MT[i] := MT[i] xor (2567483615) // 0x9908b0df } } } 2 4 Referencias bibliogracas Os links nos quais nos apoiamos para realizar a implementacao foram: http://www.math.sci.hiroshima-u.ac.jp/ ~ m-mat/MT/MT2002/CODES/mt19937ar.c Codigo fonte na linguagem C, do Makoto Matsumoto. http://www.math.sci.hiroshima-u.ac.jp/ ~ m-mat/MT/ARTICLES/mt.pdf Artigo escrito pelo Matsumoto e pelo Nishimura. http://code.activestate.com/recipes/578056-mersenne-twister/ Mersenne Twister implementado na linguagem Python. https://jazzy.id.au/2010/09/22/cracking_random_number_generators_part_3.html Explicacao do pseudo codigo do Mersenne Twister. 3