Recentemente, me acostumei a idiomas modernos, que incluem um bom gerador aleatório de ações, que geralmente é o Mersenne Twister; agora que voltei ao C ++, tenho que decidir o que usar.
Eu procurei pelas implementações do Mersenne Twister e notei que são muitas: existe uma que é mais usada e difundida, ou devo escolher uma assumindo que todas são igualmente boas?
Respostas:
O C ++ 11 inclui um gerador Mersenne Twister por padrão como parte de sua nova
<random>
interface. Por exemplo, para gerar números inteiros uniformemente entre [-10, 10] usando MT:A maior parte disso também está disponível em qualquer compilador que oferece TR1, embora os nomes sejam ligeiramente diferentes;
std::tr1::mt19937
estd::tr1::uniform_int<int>
.Normalmente, aconselho as pessoas a não usarem o Mersenne Twister. É um algoritmo correto, mas grande parte de sua popularidade é apenas marketing. 624 dimensões de aleatoriedade são mais do que a maioria das pessoas precisa, e o MT carrega requisitos de estado relativamente pesados e, quando faz um recálculo de uma tabela completa, pode danificar o cache. Pessoalmente, sou parcial com o xorshift, que oferece excelentes períodos e distribuições razoáveis para qualquer coisa que um jogo precise, com poucos requisitos de memória e CPU.
Eu escrevi um gerador xorshift compatível com C ++ 11 ( xorshift.hpp , xorshift.cpp ) e o coloquei em domínio público. Você pode conectar isso a qualquer função de randomização C ++ 11, como acima:
fonte
Outro RNG que eu usei antes para fins de jogos é o "pequeno" RNG de Bob Jenkins, descrito aqui .
(Ele também tem um RNG de força criptográfica chamado ISAAC, mas é maior e mais lento, e os jogos não precisam desse nível de força.)
fonte