Você está na página 1de 3

Mersenne Twister

Eduardo Ferreira Junior, Thawan Fidelis


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