Czy ktoś potrafi zastosować wzór, za pomocą którego zdefiniowano algorytm, na przykład tutaj:
http://www.pureprogrammer.org/java/format_project.cgi/projects/ACORN_PRNG_Test.txt
Albo tutaj na stronie autorów:
http://acorn.wikramaratna.org/concept.html
Na Wikipedii piszą, że to zdaje wszelkie testy losowości i jest szybkie. U mnie oblewa od razu w PractRand.
https://en.wikipedia.org/wiki/ACORN_(PRNG)#cite_note-wwwReferences-9
Ja bym to napisał tak:
M = 2**32
Y = [2173408735,3305678149,965344003,2350408401,3031407883]
def ACORN(Y):
for i in range(1,5):
Y[i] = (Y[i-1] + Y[i]) % M
return Y
for i in range(100):
Y = ACORN(Y)
print(Y[4])
Ale tak generowane liczby nie zdają żadnych testów, oblewają niemal natychmiast w PractRand. nawet, gdy zwiększymy modulus do 2**128 i lista będzie miała więcej niż 10 liczb, jak zalecają autorzy. Tymczasem według Wikipedii i tego co rzekomo autorzy opowiadali na konferencjach ich generator daje lepszej jakości wyniki niż Mersenne Twister.
Czy źle rozumiem przedstawiony wzór?