Note that the field of pseudorandom number generation for non-cryptographic purposes is much less rigorous than cryptography. Typically, for a new generator to be accepted as "OK" all it needs to do is pass a number of fixed statistical tests, usually one of the TestU01 batteries [1]. This is usually the only falsifiable claim you get, and if you're familiar with diffusion and how to achieve it this is easy to work out. Other falsifiable claims include equidistribution, but that is not a very useful guarantee---simply incrementing by 1 will achieve that. The notion of indistinguishability against computationally-bounded adversaries does not exist. All of this contributes to this being a field where crackpottery abounds, and is hard to distinguish good from bad.
For example, here's a generator that uses 1/4 of an AES round per output word, and that passes the Crush battery of statistical tests (which uses ~2^35 samples). Is it a good generator? I would not bet on it.
#include <stdint.h>
#include <immintrin.h>
struct S {
static const unsigned kAesRounds = 1;
union {
uint32_t state_[4 * 4];
__m128i words_[4];
} u_;
unsigned counter_;
const __m128i key_;
S(uint64_t seed)
: u_{{0}}, key_{_mm_set_epi64x(seed, -seed)}, counter_{0} {
for(unsigned i = 0; i < 16; ++i) (void)next();
}
uint32_t next() {
const uint32_t output = u_.state_[counter_];
__m128i t = u_.words_[counter_ & 3];
counter_ = (counter_ + 1) & 15;
for(unsigned i = 0; i < kAesRounds; ++i)
t = _mm_aesenc_si128(t, key_);
u_.words_[counter_ & 3] = t;
return output;
}
};
[1] http://simul.iro.umontreal.ca/testu01/tu01.html