Gerador Aleatório Mersenne Twister

De Augusto Baffa Wiki
Revisão de 19h31min de 28 de dezembro de 2020 por Abaffa (discussão | contribs) (Criou página com '<languages/> <translate> <!--T:1--> O Mersenne Twister é um gerador de números pseudo-aleatórios desenvolvido em 1997 por Makoto Matsumoto e Takuji Nishimura. Ele fornece g...')
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar
Outros idiomas:
English • ‎português do Brasil

O Mersenne Twister é um gerador de números pseudo-aleatórios desenvolvido em 1997 por Makoto Matsumoto e Takuji Nishimura. Ele fornece geração rápida de inteiros pseudo-aleatórios de alta qualidade. O Mersenne Twister foi projetado especificamente para resolver muitas das falhas encontradas em algoritmos mais antigos. (Matsumoto, 1998)


O Mersenne Twister é um algoritmo muito popular e é usado para implementar o comando "random" em diversas linguagens como Ruby, Python e R. O algoritmo Mersenne Twister cria números aleatórios de alta qualidade adequados para simulações de Monte Carlo. Mersenne Twister não é um gerador criptograficamente seguro. No entanto, sua velocidade de execução e aleatoriedade de alta qualidade o tornam um gerador muito atraente para IA.


O nome Mersenne Twister vem do fato de que o período do Mersenne Twister é sempre escolhido para ser um número primo de Mersenne.


Um número primo é qualquer número que só pode ser dividido igualmente por ele mesmo e um. Por exemplo, 5 é um número primo. Um número primo de Mersenne é qualquer número n onde M também é um número primo, como visto na equação abaixo.

[math]M_n = 2 ^ n - 1[/math]

Exemplo em Python

Exemplo com 1 milhão de sorteios
def mersenne_twister(mult=16807,mod=(2**31)-1,period=(2**30),min=0,max=1,seed=123456789, size=1):
    """Pseudorandom number generater"""
    MT = []
    
    for i in range(size):
        seed = (mult * seed) % mod
        MT.append( (max - min) * (seed / mod) + min )
        period -= 1
    
    if period == 0:
            print("Pseudorandom period nearing!!")
    
    if size == 1:
        return MT.pop()
    else:
        return MT